我想出了一个奇怪的问题.我试图隔离问题,以下是我的简化代码.
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-execute中.要清除状态,在JSF 2中,您将使用方便的方法resetValue()
,但这在JSF 1.2中不可用,您需要调用4个单独的方法setValue(null),setSubmittedValue(null),setLocalValueSet(false ),setValid(true)来清除状态.
为了弄清楚哪些组件是ajax呈现的,但是没有被ajax执行,您将使用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);