JSF2,PrimeFaces 4.0
有一个带有多个inputFields和一个selectOneRadio的表单(最后还有一些操作按钮):
<p:outputLabel for="R1" value="R1" />
<p:selectOneRadio id="R1" value="#{bean.r1Value}" required="#{bean.r1Condition}" converter="SomeConverter" >
<f:selectItems value="#{bean.r1PossibleValues}" var="r1Var" itemValue="#{r1Var}" itemLabel="#{r1Var}" />
<p:ajax process="@form" update="@form" />
</p:selectOneRadio>
<p:outputLabel for="F1" value="F1" />
<p:inputText id="F1" value="#{bean.value1}" required="#{bean.condition1}" />
<p:outputLabel for="F2" value="F2" />
<p:inputText id="F2" value="#{bean.value2}" required="#{bean.condition2}" />
如果用户选择selectOneRadio的第一个值-则需要字段F1,如果选择第二个-字段F2。
方法bean.conditionX检查radio的值(以及另一个条件)并返回true / false。
如果选择第一个单选值,则字段F1更改为必填。然后,如果我改变主意,请选择第二个单选值-我收到验证错误(该字段为F1必填)。
如果我更改:
<p:ajax process="@form" update="@form" />
至:
<p:ajax update="@form" />
接着:
-在F1和F2中输入一些值,
-在收音机中选择一个值
->输入到字段F1,F2中的值消失。
如何在selectOneRadio更改上更改一组必填字段,而又不会丢失数据并且不会出现过早的验证错误?
最佳答案
删除process
的<p:ajax>
属性,以使selectOneRadio触发部分Ajax请求,该请求仅提交selectOneRadio本身。用空格分隔的列表填充update
属性,该列表需要用空格分隔,不包括inputText组件,因为您要保留它们的值,并且仅在提交整个表单时才评估其required
状态。最后,使用listener
的<p:ajax>
属性调用服务器方法来更新使inputText组件成为必需条件的条件:
<p:selectOneRadio id="R1" value="#{bean.r1Value}" required="#{bean.r1Condition}" converter="SomeConverter" >
<f:selectItems value="#{bean.r1PossibleValues}" var="r1Var" itemValue="#{r1Var}" itemLabel="#{r1Var}" />
<p:ajax listener="#{bean.myListener()}" update="label1 label2" />
</p:selectOneRadio>
<p:outputLabel id="label1" for="F1" value="#{myBean.condition1 ? '*' : ''}" />
<p:inputText id="F1" value="#{bean.value1}" required="#{bean.condition1}" />
<p:outputLabel id="label2" for="F2" value="#{myBean.condition2 ? '*' : ''}" />
哪里
public void myListener() {
// changes the values of the required conditions based on selected value
condition1 = true;
condition2 = false;
}