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中输入一些值, - 在广播中选择一个值 - &GT;输入到字段F1,F2中的值消失。
如何更改selectOneRadio更改所需的字段集,而不会丢失数据且不会出现过早的验证错误?
答案 0 :(得分:2)
将process
属性移除到<p:ajax>
,以使selectOneRadio触发部分Ajax请求,该请求仅提交selectOneRadio本身。使用以空格分隔的需要更新的组件列表填充update
属性,不包括inputText组件,因为您希望保留其值,并且仅在提交时才会评估其required
状态整个表格。最后,使用listener
的{{1}}属性来调用服务器方法,该方法更新了使inputText组件成为必需条件:
<p:ajax>
其中
<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 ? '*' : ''}" />