JSF2: Как проверить два зависимых флажка? - PullRequest
1 голос
/ 08 декабря 2010

У меня есть форма в JSF2 с 2 флажками (<h:selectBooleanCheckbox>). По крайней мере, один из них должен быть проверен. Обе проверенные тоже в порядке, но когда ни одна не отмечена, должна быть ошибка.

Эта проверка должна работать и на ajax, т. Е. Когда пользователь проверяет / снимает флажок, сообщение об ошибке должно исчезать / появляться.

Итак, я связал оба флажка с UISelectBoolean элементами и добавил валидатор к каждому. В валидаторе я проверяю значение второго флажка, если оно ложно, и текущий флажок также установлен в ложь, выдается сообщение об ошибке. Что-то вроде:

if (newValue == false && secondCheckbox.getValue() == false) {
  throw new ValidationException();
}

Проблема в том, что когда пользователь снимает флажок на странице, в то время как другой также не отмечен, это ложное значение не передается модели или событию UISelectBoolean.

Сценарий:

  1. Первоначально оба не проверены
  2. Пользователь проверяет флажок1.
  3. newValue равно true, так что это действительно, идет к UISelectBoolean и модели.
  4. Пользователь снимает флажок1. Флажок2 равен false, newValue равен false, поэтому создается исключение. Из-за неудачной проверки это значение false не относится ни к модели, ни даже к элементу UISelectBoolean.
  5. Пользователь проверяет флажок2. True значение отправляется в модель и UISelectBoolean.
  6. Пользователь снимает флажок2. Checkbox1 все еще не отмечен на странице, но в модели и UISelectBoolean все еще есть true. Таким образом, проверка проходит, и сообщения об ошибках нет. На странице оба флажка сняты, но в модели флажок1 по-прежнему true.

Как решить такую ​​проблему?

1 Ответ

1 голос
/ 08 декабря 2010

Рассмотрим <h:selectManyCheckbox required="true">.Вот начальный пример:

<h:form>
    <h:selectManyCheckbox id="options" value="#{bean.checked}" required="true">
        <f:selectItems value="#{bean.options}" />
        <f:ajax render="optionsMessage" />
    </h:selectManyCheckbox>
    <h:message id="optionsMessage" for="options" />

    <h:commandButton value="Submit" action="#{bean.submit}">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
    <h:messages globalOnly="true" />
</h:form>

с

@ManagedBean
@RequestScoped
public class Bean {

    private List<String> checked;
    private List<String> options = Arrays.asList("first", "second");

    public void submit() {
        System.out.println("Checked: " + checked);
    }

    // ...
}

f:ajax отлично работает здесь.Возможно, вы использовали event="click" вместо (по умолчанию) event="valueChange", что приведет к тому, что флажок не будет сохранен после рендера.click вызывается непосредственно перед визуальной установкой галочки.Визуализация будет блокировать визуально установленную галочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...