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;
}

10-07 21:19