java - 从未调用过 valueChangeListener

标签 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 方法。有什么可能出错的想法吗?

我的 permissionChanged 方法:

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

最佳答案

存在三个问题:

  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()"是一个常见的黑客/解决方法。

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

关于java - 从未调用过 valueChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8215008/

相关文章:

java - 使用 curator treeCache 时,如何确保缓存准备就绪?

java - 如何创建通用数组?

JSF 复合库名称和子文件夹

angular - FormGroup 上的 ValueChanges 在 KeyUp 和 onBlur 上触发

ios - TableView 行上的开关更改会影响其他行

java - 获取事件源而不是编写它

java - builder 设计模式的缺点

java.net.SocketException : Broken pipe while accessing mysql on cloud server

jsf - JSF Beans 中的关注点分离?

javascript - 使用 widgetVar,如何禁用或启用 PrimeFaces selectOneButton