2015-02-08 86 views
0

有人能告诉我为什么valueChangeListener方法永远不会被触发吗?h:selectBooleanCheckbox从未调用过的ValueChangeListener

<h:form> 
    <h:selectBooleanCheckbox 
    value="#{reaCtrl.update}" 
    valueChangeListener="#{reaCtrl.updateC}" onclick="submit()"> 
    </h:selectBooleanCheckbox> 
    </h:form> 

的方法updateC看起来像这样:

public void updateC(ValueChangeEvent event) { 
     System.out.println("testC"); 
} 

THX

+0

如何你知道这个方法从来没有被解雇吗?!我试过你的代码,它的工作非常好!你是如何声明更新变量的? – Tarik 2015-02-09 00:20:04

+0

文本'testC'不打印。变量更新为\t private boolean。 – Yassine 2015-02-09 19:01:01

+0

我刚刚再次测试了你的代码和它的工作!你运行的是Tomcat吗?最佳版本?你是否在控制台中查看?请添加你的整个xhtml和bean code。 – Tarik 2015-02-10 00:44:50

回答

0

updateC方法将通过工艺验证阶段之后,JSF实现调用,所以我的猜测是,你有一些其他验证错误导致您的方法从不被调用。

您可以将<h:messages/>标记放置在表单的开头,以显示所有转换/验证错误。

但是,如果你想绕过验证,你可以使用immediate属性是这样的:

<h:selectBooleanCheckbox 
value="#{reaCtrl.update}" immediate="true" 
valueChangeListener="#{reaCtrl.updateC}" onclick="submit()"> 
</h:selectBooleanCheckbox> 

增加该属性将触发一个值更改事件应用后,请求值阶段,这意味着你的方法updateC将在这一阶段被调用,该方法xecutes你应该跳过在Render Response阶段之后,所以你需要修改你的方法是这样的:

public void updateC(ValueChangeEvent event) { 
     System.out.println("testC"); 
     FacesContext context = FacesContext.getCurrentInstance(); 
     context.renderResponse(); 
}