gpt4 book ai didi

jsf - 仅当验证失败时,输入字段才保留以前的值

转载 作者:行者123 更新时间:2023-12-04 00:06:07 26 4
gpt4 key购买 nike

我想出了一个奇怪的问题。我试图隔离问题,因此以下是我的简化代码。

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>

这是错误的路径:
  • 加载页面
  • 单击第一行中的“编辑”链接(弹出显示)
  • 在弹出窗口中,清除“年龄”字段并单击“保存”。(显示必需的消息)
  • 点击取消(不填写“年龄”字段)
  • 点击第二个链接。
  • 现在它显示不相关的数据(以前的数据)。 - 这是问题
  • 即使我单击“新建”按钮,它也会显示不正确的数据。

  • 仅当弹出窗口中的验证失败时才会发生这种情况。
    有解决方案吗?

    最佳答案

    这个问题在 JSF 2 中也有认识并在以下回答中详细解释:How can I populate a text field using PrimeFaces AJAX after validation errors occur?如果您使用的是 JSF 2,您可以使用 OmniFaces 的 ResetInputAjaxActionListener 或 PrimeFaces' <p:resetInput> or 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方法,但这在尚未标准化 ajax 的 JSF 1.2 中不可用。您需要摆弄 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);

    关于jsf - 仅当验证失败时,输入字段才保留以前的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14371723/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com