强制用户在显示相同列表的多个 h:selectOneMenu 中 select 不同的值
Force user to select different values in multiple h:selectOneMenu showing same lists
我对 JSF 和 Primefaces 比较陌生。我有一个页面,其中有三个 selectOneMenu 显示来自地图的同一组值。我想确保用户为三个下拉菜单选择不同的值。我通过编写自定义验证器实现了这一点。但是验证器只有在我点击提交页面时才有效。我想要一个 ajax 调用,只要用户选择与下拉菜单 1.Also 相同的值,它就会显示下拉菜单 2 的错误消息,与下拉菜单 3.Here 的情况相同我的代码片段:
user.xhtml
<h:outputLabel for="Question1" value="#{msg['account.question1']}"/>
<h:message styleClass="validation-error" for="Question1"/>
<h:selectOneMenu id="Question1" required="true" value="#{account.question1}" class="smallTxt">
<f:selectItems value="#{controller.questionMap}" />
<f:validator validatorId="com.validator.QuestionsValidator"></f:validator>
</h:selectOneMenu>
<h:outputLabel for="Answer1" value="#{msg['account.answer1']}"/>
<h:message styleClass="validation-error" for="Answer1"/>
<h:inputText id="Answer1" required="true" value="#{account.answer1}" />
<h:outputLabel for="Question2" value="#{msg['account.question2']}"/>
<h:message styleClass="validation-error" for="Question2"/>
<h:selectOneMenu id="Question2" required="true" value="#{account.question2}" class="smallTxt">
<f:selectItems value="#{controller.questionMap}" />
</h:selectOneMenu>
<h:outputLabel for="Answer2" value="#{msg['account.answer2']}"/>
<h:message styleClass="validation-error" for="Answer2"/>
<h:inputText id="Answer2" required="true" value="#{account.answer2}" />
<h:outputLabel for="Question3" value="#{msg['account.question3']}"/>
<h:message styleClass="validation-error" for="Question3"/>
<h:selectOneMenu id="Question3" required="true" value="#{account.question3}" class="smallTxt">
<f:selectItems value="#{controller.questionMap}" />
</h:selectOneMenu>
<h:outputLabel for="Answer3" value="#{msg['account.answer3']}"/>
<h:message styleClass="validation-error" for="Answer3"/>
<h:inputText id="Answer3" required="true" value="#{account.answer3}" />
我正在使用 JSF 2 和 Primefaces 5.2。
提前致谢
您可以在 selectonemenu.linke 上应用侦听器:
<p:selectOneMenu id="country" value="#{dropdownView.country}" style="width:150px">
<p:ajax listener="#{dropdownView.onCountryChange}" update="city" />
<f:selectItem itemLabel="Select Country" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{dropdownView.countries}" />
</p:selectOneMenu>
然后在这个 oncountrychange() 函数中,您将获得所有三个 select 项的值并进行比较。
如果你想在 AJAX 调用上执行你的验证器,你必须将 <f:ajax />
添加到你的 <h:selectOneMenu>
<h:selectOneMenu id="Question1" required="true" value="#{account.question1}" class="smallTxt">
<f:selectItems value="#{controller.questionMap}" />
<f:validator validatorId="com.validator.QuestionsValidator"></f:validator>
<f:ajax />
</h:selectOneMenu>
附带问题:您声明您使用 Primefaces 5.2,但您使用的是 JSF 标准组件(<h:selectOneMenu>
而不是 <p:selectOneMenu>
)。是故意的吗?
我对 JSF 和 Primefaces 比较陌生。我有一个页面,其中有三个 selectOneMenu 显示来自地图的同一组值。我想确保用户为三个下拉菜单选择不同的值。我通过编写自定义验证器实现了这一点。但是验证器只有在我点击提交页面时才有效。我想要一个 ajax 调用,只要用户选择与下拉菜单 1.Also 相同的值,它就会显示下拉菜单 2 的错误消息,与下拉菜单 3.Here 的情况相同我的代码片段:
user.xhtml
<h:outputLabel for="Question1" value="#{msg['account.question1']}"/>
<h:message styleClass="validation-error" for="Question1"/>
<h:selectOneMenu id="Question1" required="true" value="#{account.question1}" class="smallTxt">
<f:selectItems value="#{controller.questionMap}" />
<f:validator validatorId="com.validator.QuestionsValidator"></f:validator>
</h:selectOneMenu>
<h:outputLabel for="Answer1" value="#{msg['account.answer1']}"/>
<h:message styleClass="validation-error" for="Answer1"/>
<h:inputText id="Answer1" required="true" value="#{account.answer1}" />
<h:outputLabel for="Question2" value="#{msg['account.question2']}"/>
<h:message styleClass="validation-error" for="Question2"/>
<h:selectOneMenu id="Question2" required="true" value="#{account.question2}" class="smallTxt">
<f:selectItems value="#{controller.questionMap}" />
</h:selectOneMenu>
<h:outputLabel for="Answer2" value="#{msg['account.answer2']}"/>
<h:message styleClass="validation-error" for="Answer2"/>
<h:inputText id="Answer2" required="true" value="#{account.answer2}" />
<h:outputLabel for="Question3" value="#{msg['account.question3']}"/>
<h:message styleClass="validation-error" for="Question3"/>
<h:selectOneMenu id="Question3" required="true" value="#{account.question3}" class="smallTxt">
<f:selectItems value="#{controller.questionMap}" />
</h:selectOneMenu>
<h:outputLabel for="Answer3" value="#{msg['account.answer3']}"/>
<h:message styleClass="validation-error" for="Answer3"/>
<h:inputText id="Answer3" required="true" value="#{account.answer3}" />
我正在使用 JSF 2 和 Primefaces 5.2。 提前致谢
您可以在 selectonemenu.linke 上应用侦听器:
<p:selectOneMenu id="country" value="#{dropdownView.country}" style="width:150px">
<p:ajax listener="#{dropdownView.onCountryChange}" update="city" />
<f:selectItem itemLabel="Select Country" itemValue="" noSelectionOption="true" />
<f:selectItems value="#{dropdownView.countries}" />
</p:selectOneMenu>
然后在这个 oncountrychange() 函数中,您将获得所有三个 select 项的值并进行比较。
如果你想在 AJAX 调用上执行你的验证器,你必须将 <f:ajax />
添加到你的 <h:selectOneMenu>
<h:selectOneMenu id="Question1" required="true" value="#{account.question1}" class="smallTxt">
<f:selectItems value="#{controller.questionMap}" />
<f:validator validatorId="com.validator.QuestionsValidator"></f:validator>
<f:ajax />
</h:selectOneMenu>
附带问题:您声明您使用 Primefaces 5.2,但您使用的是 JSF 标准组件(<h:selectOneMenu>
而不是 <p:selectOneMenu>
)。是故意的吗?