Поля ввода содержат предыдущие значения только в случае сбоя проверки

Я придумал странную проблему. Я попытался изолировать проблему, поэтому ниже приведен мой упрощенный код.

public class MyBean {

  private List<Data> dataList;
  Data selectedData;

  public MyBean() {
    dataList = new ArrayList<Data>();
    dataList.add(new Data("John", 16));
    dataList.add(new Data("William", 25));
  }

  public List<Data> getDataList() {
    return dataList;
  }

  public void edit(Data data) {
    selectedData = data;
  }
  public void newData() {
    selectedData = new Data(null, null);
  }

  public Data getSelectedData() {
    return selectedData;
  }

  public class Data {
    String name;
    Integer age;
    Data(String name, Integer age) {
      this.name = name;
      this.age = age;
    }
    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }
    public Integer getAge() {
      return age;
    }
    public void setAge(Integer age) {
      this.age = age;
    }
  }
}

XHTML-кода:

<rich:modalPanel id="pop">
  <h:form>
    Name: <h:inputText value="#{myBean.selectedData.name}" required="true" id="txtName"/><br/>
    Age : <h:inputText value="#{myBean.selectedData.age}" required="true" id="txtAge"/>
    <a4j:commandButton value="Save"/>
    <a4j:commandButton value="Close" onclick="Richfaces.hideModalPanel('pop');return false;"/>
    <br/>
    <rich:message for="txtName"/><br/>
    <rich:message for="txtAge"/>
  </h:form>     
</rich:modalPanel>

<h:form>
  <rich:dataTable value="#{myBean.dataList}" var="data">
    <rich:column>#{data.name}</rich:column>
    <rich:column>
      <a4j:commandLink value="Edit" action="#{myBean.edit(data)}" reRender="pop" oncomplete="Richfaces.showModalPanel('pop')"/>
    </rich:column>
  </rich:dataTable>
  <a4j:commandButton value="New" action="#{myBean.newData()}" reRender="pop" oncomplete="Richfaces.showModalPanel('pop')"/>
</h:form>

это путь к ошибке:

  1. загрузить страницу
  2. нажмите ссылку" Изменить " в первой строке (всплывающие окна)
  3. во всплывающем окне очистите поле " возраст "и нажмите"Сохранить".(Требуемое сообщение показано)
  4. Нажмите кнопку "Отмена" (без наполнения "возраст" поле)
  5. нажмите вторую ссылку.
  6. теперь он показывает нерелевантные данные(предыдущие данные). - Это проблема
  7. даже когда я нажимаю кнопку "Создать", она показывает неправильные данные.

это происходит только в случае сбоя проверки во всплывающем окне.
Есть ли решение для этого?

3 ответов


эта проблема в JSF 2 также распознается и подробно объясняется в следующем ответе:как я могу заполнить текстовое поле с помощью PrimeFaces AJAX после возникновения ошибок проверки? если бы вы использовали JSF 2, вы могли бы использовать OmniFaces' ResetInputAjaxActionListener или PrimeFaces'<p:resetInput> или resetValues="true" для этого.

к моменту, вам нужно очистить состояние EditableValueHolder компонент, когда он собирается быть ajax-визуализирован, но который не включен в ajax-execute. Чтобы очистить состояние, в JSF 2 вы бы использовали метод удобства resetValue() для этого, но это недоступно в JSF 1.2, и вам нужно вызвать 4 отдельных метода setValue(null), setSubmittedValue(null), setLocalValueSet(false), setValid(true) очистить государство.

чтобы выяснить, какие компоненты должны быть AJAX-визуализированы, но не были ajax-выполнены, в JSF 2 вы бы использовали PartialViewContext методы для этого, но это недоступно в JSF 1.2 который еще не стандартизировал ajax. Вам нужно будет возиться с конкретным API ajax RichFaces, чтобы понять это. Я не могу сказать это с макушки головы, поэтому вот пример запуска, предполагающий, что вы уже знаете компоненты, которые нужно очистить. Представьте, что форма в вашем всплывающем окне имеет id="popForm" и поле ввода имени имеет id="nameInput", вот как вы могли бы очистить его внутри newData() способ:

UIInput nameInput = (UIInput) context.getViewRoot().findComponent("popForm:nameInput");
nameInput.setValue(null);
nameInput.setSubmittedValue(null);
nameInput.setLocalValueSet(false);
nameInput.setValid(true);

сделайте одну вещь при отмене действия установите все всплывающие значения null. теперь в следующем клике все значения установлены по умолчанию.

или при щелчке установить все предыдущие значения null. и установите все соответствующие значения после этого.


У меня была та же проблема. если вы используете Primefaces, решение так же просто, как положить resetValues="true" на p: commandLink или P: commandButton, которая загружает выбранный элемент.