valueChangeListener从未调用过

时间:2011-11-21 16:24:53

标签: java jsf valuechangelistener

我有以下几段代码:

 <h:panelGroup rendered="#{userTypeController.permissionItemsUserType.contains(item)}">
                    <h:selectBooleanCheckbox valueChangeListener="#{userTypeController.permissionChanged(this)}" value="#{true}"/> 
                    <h:outputText value="#{item.getAction()}" />
                </h:panelGroup>
                <h:panelGroup rendered="#{!userTypeController.permissionItemsUserType.contains(item)}">
                    <h:selectBooleanCheckbox value="#{false}"/> 
                    <h:outputText value="#{item.getAction()}" />
                </h:panelGroup>

但由于某种原因,永远不会调用permissionChanged方法。什么可能出错的想法?​​

我的许可改变方法:

    public void PermissionChanged(ValueChangeEvent event) {
    System.out.println("test");
}

2 个答案:

答案 0 :(得分:11)

有三个问题:

  1. EL中的侦听器方法调用是错误的。你不应该沿着它传递当前的组件。

    替换

    valueChangeListener="#{userTypeController.permissionChanged(this)}"
    

    通过

    valueChangeListener="#{userTypeController.permissionChanged}"
    
  2. 支持bean中的方法签名错误。它应符合Java naming conventions

    替换

    public void PermissionChanged(ValueChangeEvent event) {
    

    通过

    public void permissionChanged(ValueChangeEvent event) {
    
  3. 您似乎期望在您点击复选框时立即触发(否则您会看到ELException)。这种期望是不正确的。只有在您提交表单时才会触发它。使用onclick="submit()"是一种常见的黑客/解决方法。

  4. 尽管如此,可能有更好的方法。由于功能要求不清楚,因此无法提出正确的解决方案。如果您想要的只是即时和异步反馈并重新渲染,我认为<f:ajax>正是您正在寻找的。虽然您的问题中缺少JSF 2.0标记,但根据您使用JSF 2.0的问题历史记录,<f:ajax>应该适合您。

答案 1 :(得分:0)

如果使用JSF 1.2则无法将参数传递给侦听器。你使用:

"#{userTypeController.permissionChanged}" 

阅读here