2010-12-08 2 views
1

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

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

Поэтому я привязал оба флажка к UISelectBoolean элементам и добавил валидатор к каждому. В валидаторе я проверяю значение второго флажка, если оно ложно, а текущий флажок также установлен в значение false, создается ошибка errormessage. Smth нравится:

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

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

Сценарий:

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

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

+0

Любые причины, по которым вы не можете использовать ``? – BalusC 2010-12-08 13:23:50

+0

Да, не знал этого :) Спасибо! – amorfis 2010-12-08 15:14:37

ответ

1

Рассмотрите <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 называется прямо перед тем, как флажок получить визуально. Отметка будет блокировать визуально установленную галочку.

Смежные вопросы