Проблема проверки JSF - применяет обязательную проверку полей для отключенных полей - PullRequest
0 голосов
/ 23 сентября 2010

У меня проблема с required = true проверка, которая применяется к отключенным полям.

У меня есть a4j: commandButton и два раскрывающихся списка, содержащие список состояний и список стран внутри формы. Оба раскрывающихся списка имеют обязательную проверку "true". раскрывающийся список состояний включен и раскрывающийся список стран отключен по умолчанию с помощью атрибута тега disabled = "true", как показано ниже:

<h:selectOneMenu value="#{states}" required="true">
  <f:selectItems>
</h:selectOneMenu>

и

<h:selectOneMenu value="#{countries}" disabled="true" required="true">
  <f:selectItems>
</h:selectOneMenu>

Сценарий # 1: нажмите кнопку a4j: commandButton, не выбирая ничего в раскрывающемся списке состояний. результат: требуемая ошибка проверки поля для ожидаемого раскрывающегося списка состояний

Теперь при нажатии переключателя (вне формы) раскрывающийся список состояний отключается, а раскрывающийся список стран включается с помощью jquery / javascript, как показано ниже:

$j('#stateDropdown').attr('disabled', 'disabled');
$j('#countryDropdown').removeAttr('disabled');

Сценарий № 2: щелкните по кнопке a4j: commandButton, не выбирая ничего в раскрывающемся списке стран. результат: обязательная ошибка проверки поля для раскрывающихся списков как для штата, так и для страны. Однако ожидалась только ошибка проверки для выпадающего списка стран.

HTML-код, сгенерированный тегом <h:selectOneMenu> во время выполнения:

для раскрывающегося списка, отключенного с помощью тега jsf attibute: <select disabled="disabled">...</select>

для раскрывающегося списка, отключенного с помощью jquery: <select disabled="">...</select>

Кто-нибудь знает, почему jsf проверяет поля, отключенные jquery?

1 Ответ

0 голосов
/ 23 сентября 2010

JSF выполняет проверку на основе дерева JSF UIComponent на стороне сервера, а не на дереве HTML DOM на стороне клиента, как вы, вероятно, ожидаете. С помощью jQuery вы изменяете только HTML-дерево DOM на стороне клиента , не уведомляя JSF об изменении состояния, чтобы оно могло отражать его в дереве компонентов.

Вы должны отключить / включить его, используя JSF вместо jQuery. Поскольку вы используете Ajax4jsf, вы можете использовать a4j:support для этого.

<h:selectOneMenu value="#{bean.state}" required="true">
    <f:selectItems value="#{bean.states}" />
    <a4j:support event="change" reRender="country" />
</h:selectOneMenu>
<h:selectOneMenu id="country" value="#{bean.country}" required="true" disabled="#{bean.countryDisabled}">
    <f:selectItems value="#{bean.countries}" />
</h:selectOneMenu>

В этом примере <a4j:support> будет повторно отображать раскрывающийся список страны при каждом изменении раскрывающегося состояния. В свою очередь, раскрывающийся список страны имеет свой атрибут disabled, связанный с логическим свойством бина. Вы должны убедиться, что он возвращает желаемый результат на основе текущего выбранного состояния. Вы можете сделать это в методе получения или в valueChangeListener раскрывающегося списка состояний.

...