根据selectOneRadio值生成所需的组件

时间:2014-03-26 16:33:32

标签: ajax jsf primefaces

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更改所需的字段集,而不会丢失数据且不会出现过早的验证错误?

1 个答案:

答案 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 ? '*' : ''}" />