valueChangeListener从未调用过

Tho*_*rge 2 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>
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,从未调用permissionChanged方法.什么可能出错的想法?

我的许可改变方法:

    public void PermissionChanged(ValueChangeEvent event) {
    System.out.println("test");
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 11

有三个问题:

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

    更换

    valueChangeListener="#{userTypeController.permissionChanged(this)}"
    
    Run Code Online (Sandbox Code Playgroud)

    通过

    valueChangeListener="#{userTypeController.permissionChanged}"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 支持bean中的方法签名是错误的.它应该符合Java命名约定.

    更换

    public void PermissionChanged(ValueChangeEvent event) {
    
    Run Code Online (Sandbox Code Playgroud)

    通过

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

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