输入字段仅持有,如果验证失败,之前的值(Input fields hold previous val

2019-07-18 07:32发布

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

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. 甚至当我点击“新建”按钮,它显示不正确的数据。

出现这种情况只有在验证失败在弹出。
是否有一个解决方案?

Answer 1:

这个问题在JSF 2也承认,并在下面的答案详细的解释: 我怎样才能填充出现验证错误后使用PrimeFaces AJAX的文本字段? 如果您使用JSF 2,则也可以使用OmniFaces' ResetInputAjaxActionListener或PrimeFaces' <p:resetInput>resetValues="true"这一点。

为了这一点,你需要清除的状态EditableValueHolder组件时,它的大约是Ajax的渲染,但不包括在Ajax的执行。 要清除状态,在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);


Answer 2:

做取消操作设置所有弹出值零一两件事。 现在在你的下一个点击的所有值设置为默认值。

或点击设置所有以前的值空。 并设置后,所有相应的值。



Answer 3:

我有同样的问题。 如果您正在使用Primefaces,解决的办法是把作为简单resetValues="true"你的号码:commandLink或P:的commandButton加载所选项目。



文章来源: Input fields hold previous values only if validation failed