仅当验证失败时,输入字段才包含先前的值

pra*_*eth 12 jsf richfaces popup ajax4jsf jsf-1.2

我想出了一个奇怪的问题.我试图隔离问题所以以下是我的简化代码.

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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

这是错误的路径:

  1. 加载页面
  2. 单击第一行中的"编辑"链接(弹出显示)
  3. 在弹出窗口中,清除"年龄"字段并单击"保存".(显示所需消息)
  4. 点击取消(不填写"年龄"字段)
  5. 单击第二个链接.
  6. 现在它显示了不相关的数据(以前的数据).- 这就是问题
  7. 即使我点击"新建"按钮,它也会显示不正确的数据.

只有在弹出窗口中验证失败时才会发生这种情况.
这有解决方案吗?

Bal*_*usC 31

这个问题在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.你需要摆弄RichFaces特定的ajax API才能算出来.我不能从头顶说出来,所以这是一个启动示例,假设您已经知道需要清除的组件.想象一下,弹出窗口中的表单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);
Run Code Online (Sandbox Code Playgroud)