icefaces htmlselectbooleancheckbox uncheck not working

3.1k Views Asked by At

I am using icefaces 1.8.2 and i have a HtmlBooleanCheckbox on my page that I need to uncheck when certain circumstances are met.

the checkbox on the page is like this

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

and the binded object is a property of the managed bean with proper getter and setter

private HtmlSelectBooleanCheckbox termsAgreement;

i can check the checkbox in code, validator works fine and all the stuff i do with it are ok too but I just cant find a way to uncheck it on the server side.

I tried:

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

but nothing works. Even if I debug it it shows value = null but when the page renders it still appears checked. Once I check it I just cant get it unchecked unless I click it manually on the page.

funny thing is that

termsAgreement.setValue(Boolean.TRUE)

works fine.

Anyone any tips how I can uncheck it server side on the binded object? Thank you in advance for help.

1

There are 1 best solutions below

2
On BEST ANSWER

You are facing a common issue faced by ICEfaces/JSF developers.

First of all, you need to understand how JSF lifecycle works.

Following is a good article to read.

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

For your case, bind a value to <ice:selectBooleanCheckbox>.

For example value="#{managedBean.termsAgreed}".

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

Do not try to change the value from the component. Always change value from the value binding. In this example, you must change the value termsAgreed.

If your action/actionListener is not immediate, i.e `immediate="false", which is the default value, then changing the value in server-side will check/uncheck checkbox component.

If you are using immediate="true", then you must call resetValue() method in your component, HtmlSelectBooleanCheckbox:

termsAgreement.resetValue();

Ideally, you shouldn't call setValue() methods in components. You will understand it when you understand the JSF lifecycle.

Hope this will help!