jsf – 仅当验证失败时,输入字段才保留以前的值
我想出了一个奇怪的问题.我试图隔离问题,以下是我的简化代码.
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" 为此.
至此,您需要清除 为了弄清楚哪些组件是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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |