У меня есть два компонента PrimeFaces selectOneMenu. Когда для первого компонента установлено определенное значение, мне нужно, чтобы второй компонент стал обязательным. Я использую Ajax и привязку для обновления второго компонента при отправке первого, чтобы пользователь видел требуемый «*» рядом с меткой второго компонента. Эта часть проста.
Вот (несколько упрощенный) код:
<p:outputLabel id="foolbl" for="foo"
value="Foo" />
<p:selectOneMenu id="foo" required="true"
value="#{bean.foo}" binding="#{foobnd}">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems
value="#{bean.foovalues}" />
<p:ajax
update="@this foolbl bar barlbl"
process="@this"/>
</p:selectOneMenu>
<p:outputLabel id="barlbl" for="bar"
value="Bar" />
<p:selectOneMenu id="bar"
required="#{foobnd.valid and foobnd.value eq 'value1'}"
value="#{bean.bar}">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems
value="#{bean.barValues}" />
<p:ajax update="@this barlbl" process="@this" />
</p:selectOneMenu>
Он работает нормально, за следующим исключением:
- Пользователь выбирает «значение 1» из foo. Результат: Bean обновляется с помощью foo & bar и становится обязательным;
- Пользователь выбирает некоторое значение из бара. Результат: бин обновляется баром;
- Пользователь отменяет выбор значения в строке (выбирает «Выбрать одно»). Результат: проверка не пройдена, так как требуется полоса. Бин не обновляется;
- Пользователь отменяет выбор значения в foo (выбирает «Выбрать одно»). Результат: Bean обновляется с помощью foo. Bar обновляется ранее отправленным значением bean.bar ("значение 1").
Очевидно, это работает так, как должно для JSF. Однако я обеспокоен тем, что это приведет к тому, что пользователь не заметит проблемы и случайно отправит значение для bean.bar, хотя он этого не собирался делать. Это своего рода крайний случай, но пользователь может выбрать «Выбрать один» в foo, а затем выбрать какое-либо значение, отличное от «значения 1», что приведет к проблеме.
Чтобы избежать этого, я мог добавить bar к атрибуту процесса ajax-вызова foo следующим образом:
<p:selectOneMenu id="foo" required="true"
value="#{bean.foo}" binding="#{foobnd}">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems
value="#{bean.foovalues}" />
<p:ajax
update="@this foolbl bar barlbl"
process="@this bar"/>
</p:selectOneMenu>
Это предотвращает ранее описанную проблему, но также имеет непреднамеренное последствие отправки значения для bar при начальном выборе foo и, следовательно, выделение bar красным цветом для неудачной проверки. Я не хочу, чтобы это произошло. Когда foo отправляется, я хочу, чтобы рядом с баром отображалась только «*». Я не хочу, чтобы это было выделено, так как проверка не удалась.
Я экспериментировал со слушателями и валидаторами клиентов, чтобы решить эту проблему, но пока ничего не получается. resetValues также не совсем делает то, что я хочу, так как мне не нравится просто повторно выбирать значение, которое пользователь только что не выбрал.
Я использую ПраймФейс 6.
Каков наилучший способ добиться этого?