Заставить пользователя выбирать разные значения в нескольких h:selectOneMenu, показывая те же списки

Я относительно новичок в JSF и Primefaces. У меня есть страница, на которой у меня есть три selectOneMenu, отображающие один и тот же набор значений из карты. Я хотел бы убедиться, что пользователь выбирает разные значения для трех выпадающих. Я добился этого, написав собственный валидатор. Но валидатор работает, только если я нажму на страницу отправки. Я хочу получить вызов ajax, который бы отображал сообщение об ошибке для выпадающего списка 2, как только пользователь выберет то же значение, что и раскрывающийся список. 1. Аналогичный случай для раскрывающегося списка. 3. Вот мой фрагмент кода:

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. заранее спасибо

2 ответа

Решение

Если вы хотите выполнить свой валидатор при вызове 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>). Это специально?

Вы можете применить слушателя на 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() вы получите значения всех трех выбранных элементов и сравните их.

Другие вопросы по тегам