我有以下代码:

 <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");
}

最佳答案

存在三个问题:


您在EL中的侦听器方法调用错误。您不应该将当前组件传递给它。

更换

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


通过

valueChangeListener="#{userTypeController.permissionChanged}"

您在支持bean中的方法签名是错误的。它应该符合Java naming conventions

更换

public void PermissionChanged(ValueChangeEvent event) {


通过

public void permissionChanged(ValueChangeEvent event) {

您似乎希望单击复选框时会立即触发它(否则您会看到ELException)。这个期望是不正确的。仅在您提交表格时才会触发。为此,使用onclick="submit()"是常见的破解方法。


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

09-06 07:09
查看更多