2013-01-31 3 views
0

Я использую icefaces 1.8.2, и у меня есть HtmlBooleanCheckbox на моей странице, что мне нужно снять галочку при выполнении определенных условий.icefaces htmlselectbooleancheckbox uncheck not working

флажок на странице, как этот

<ice:selectBooleanCheckbox id="accepttermscheckbox" 
    binding="#{managedBean.termsAgreement}" 
    validator="#{managedBean.validateAgreement}"> 
</ice:selectBooleanCheckbox> 

и переплетены объект является собственностью управляемого компонента с надлежащей геттер и сеттер

private HtmlSelectBooleanCheckbox termsAgreement; 

я могу проверить флажок в коде, валидатор работает отлично, и все, что я делаю с ним, тоже хорошо, но я просто не могу найти способ снять его с сервера.

Я пробовал:

termsAgreement.setValue(Boolean.FALSE) 
termsAgreement.setValue(null) 
termsAgreement.setSelected(false) 

, но ничего не работает. Даже если я его отлаживаю, он показывает значение = null, но когда страница отображает его, все еще отображается флажок. Как только я его проверю, я просто не могу его снять, если не щелкнуть его вручную на странице.

Самое смешное, что

termsAgreement.setValue(Boolean.TRUE) 

работает отлично.

Какие-нибудь подсказки, как я могу снять флажок с его серверной стороны на связанном объекте? Заранее спасибо за помощь.

ответ

3

Перед вами стоят проблемы, с которыми сталкиваются разработчики ICEfaces/JSF.

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

Ниже приведена хорошая статья для чтения.

http://www.ibm.com/developerworks/library/j-jsf2/

В вашем случае, связать значение <ice:selectBooleanCheckbox>.

Например, value="#{managedBean.termsAgreed}".

<ice:selectBooleanCheckbox id="accepttermscheckbox" 
    binding="#{managedBean.termsAgreement}" 
    validator="#{managedBean.validateAgreement}" 
    value="#{managedBean.termsAgreed}"> 
</ice:selectBooleanCheckbox> 

Не пытайтесь изменить значение компонента. Всегда изменяйте значение из привязки значения. В этом примере вы должны изменить значение termsAgreed.

Если ваше действие/actionListener не является непосредственным, то i.e `немедленно =" false ", которое является значением по умолчанию, а затем изменение значения на стороне сервера будет проверять/снимать флажок.

Если вы используете immediate="true", то вы должны вызвать resetValue() метод в компоненте, HtmlSelectBooleanCheckbox:

termsAgreement.resetValue(); 

В идеале, вы не должны вызывать setValue() методы в компонентах. Вы поймете это, когда поймете жизненный цикл JSF.

Надеюсь, это поможет!

+0

Благодарим вас за ответ.Я не знал, что вам нужно явно написать атрибут value, когда у вас уже есть привязка. Я думал, что привязка делает все это для тебя. В любом случае, когда я сделал setSubmitedValue (false), он также работал, хотя я не уверен, что я должен это делать. Ваше решение, похоже, больше подходит, а мой взгляд больше похож на хак. –

+0

Добро пожаловать! Не используйте также метод setSubmittedValue(). Как вы сказали, многие используют его как хак. Но эти методы (setValue(), setSubmittedValue()) являются частью жизненного цикла JSF. Вот почему я сказал, что вы поймете это более четко, когда будете читать о жизненном цикле JSF. –