обязательный атрибут inputText должен зависеть от представленного значения другого компонента

У меня есть форма, которая содержит раскрывающийся список и два поля ввода.

<h:selectOneMenu />
<h:inputText />
<h:inputText />

Я хотел бы сделать обязательный атрибут полей ввода условным в зависимости от выбранного значения раскрывающегося списка. Если пользователь выбирает первый элемент раскрывающегося списка, поля ввода должны быть обязательными. Если пользователь выберет второй элемент, то они не потребуются.

Как я могу этого добиться?


person user1213679    schedule 16.02.2012    source источник


Ответы (2)


Просто привяжите раскрывающийся список к представлению и непосредственно проверьте его значение в атрибуте required.

<h:selectOneMenu binding="#{menu}" value="#{bean.item}">
    <f:selectItem itemValue="first" itemLabel="First item" />
    <f:selectItem itemValue="second" itemLabel="Second item" />
</h:selectOneMenu>

<h:inputText value="#{bean.input1}" required="#{menu.value eq 'first'}" />
<h:inputText value="#{bean.input2}" required="#{menu.value eq 'first'}" />

Обратите внимание, что пример binding представлен как есть. Абсолютно не устанавливайте здесь свойство bean-компонента. См. также Как работает атрибут «binding» в JSF? Когда и как его следует использовать?

Также обратите внимание, что порядок компонентов имеет большое значение. Если меню расположено под входами в дереве, используйте вместо него #{menu.submittedValue eq 'first'}. Или, если вы хотите быть независимым от этого, используйте вместо этого #{param[menu.clientId] eq 'first'}.

person BalusC    schedule 16.02.2012
comment
При отправке формы новое значение selectOneMenu не будет применяться при проверке. Атрибут immediate при выборе может обойти это. - person McDowell; 16.02.2012
comment
Или с помощью привязки компонента в приведенном выше примере предполагается, что компонент расположен перед входными данными. - person BalusC; 16.02.2012
comment
Это кажется простым решением, но, к сожалению, оно не работает. Menu.value имеет значение null, хотя непосредственный атрибут, установленный для selectOneMenu, имеет значение true. - person user1213679; 16.02.2012
comment
Не стоит ставить immediate="true" и нужно сделать так, чтобы входы были после меню. Если наоборот, используйте #{menu.submittedValue}. - person BalusC; 16.02.2012
comment
К сожалению, это не работает. Я вставляю свой код: ‹h:selectOneListbox id=edit_regtype size=1 value=#{registerBean.selectedPackage} convert=#{packageConverter} binding=#{pack}› ‹f:selectItems value=#{registerBean.packages} var= package itemValue=#{package.id} itemLabel=#{package.packageName} › ‹/f:selectItems› ‹/h:selectOneListbox› ‹h:message for=edit_regtype class=error_reg /›‹br/› ‹h:inputText id=edit_duration value=#{registerBean.shop.regDuration} required=#{pack.submittedValue == '1'} › ‹f:validator validatorId=durationValidator /› ‹/h:inputText› - person user1213679; 17.02.2012
comment
Входные данные находятся после списка, поэтому вы должны использовать #{pack.value}. Далее вы обрабатываете числовое значение как строку, заключая ее в кавычки. Каков реальный тип значения? Целочисленный/длинный тип? Если это так, удалите эти одинарные кавычки: #{pack.value == 1}. - person BalusC; 17.02.2012

Предполагая, что вы используете JSF 2.0: пусть ваш SelectOneListBox выполняется с помощью ajax и повторно отображает поля ввода при изменении списка:

Быстрый набросок:

<h:selectOneMenu value="#{myBean.myMenuValue}">
  <f:ajax render="input1"/>
   ..
</h:selectOneMenu>

<h:inputText id="input1" value="#{myBean.myInputValue}" 
             required="#{myBean.myMenuValue == 'firstEntry'}" />
person Matt Handy    schedule 16.02.2012