为啥没有为 primefaces SelectManyCheckbox 调用事件侦听器?

Posted

技术标签:

【中文标题】为啥没有为 primefaces SelectManyCheckbox 调用事件侦听器?【英文标题】:Why event listener not being invoked for primefaces SelectManyCheckbox?为什么没有为 primefaces SelectManyCheckbox 调用事件侦听器? 【发布时间】:2017-12-24 15:01:36 【问题描述】:

单击复选框时不会调用 SelectManyCheckbox 的事件侦听器。

我的 SelectManyCheckbox 代码:

    SelectManyCheckbox smcb = new SelectManyCheckbox();

    UISelectItem item = new UISelectItem();
    item.setItemValue("ItemValue");
    item.setItemLabel("ItemLabel");

    smcb.getChildren().add(item);

我已经尝试过 AjaxBehavior:

    AjaxBehavior ajaxBeh = (AjaxBehavior) fc.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
    ajaxBeh.setRender(Collections.singletonList("@this"));
    ajaxBeh.setExecute(Collections.singletonList("@this"));
    ajaxBeh.setImmediate(true);
    ajaxBeh.setTransient(true);
    ajaxBeh.addAjaxBehaviorListener(new AjaxBehaviorListener() 
        @Override
        public void processAjaxBehavior(AjaxBehaviorEvent e)
                throws AbortProcessingException 
            System.out.println("Event Triggered");
        
    );

    smcb.addClientBehavior("change",ajaxBeh);

还有ValueChangeListener:

    public class CustomValueChangeListener implements ValueChangeListener 
    @Override
    public void processValueChange(ValueChangeEvent arg0)
           throws AbortProcessingException 
        System.out.println("processValueChange");
        
    

    smcb.addValueChangeListener(new CustomValueChangeListener ());

以上两种方法都不行。

如何设置事件监听器,以便在选中或取消选中复选框时调用它?

【问题讨论】:

为什么需要用Java来做 【参考方案1】:

我认为您可以很好地尝试通过调用 valueChangeListener 从 jsf 代码运行 ajax 事件并在 Bean 端处理您的选择。

JSF Code:
<p:selectManyCheckbox id="custom" columns="1" layout="pageDirection" value="#dapBean.selection" disabled="#!dapBean.status"
                    valueChangeListener="#dapBean.checkListener">
    <f:selectItems value="#dapBean.toolOptions" var="tool" itemLabel="#tool.toolLabel" itemValue="#tool.toolLabel" />
    <f:ajax event="valueChange" update = "@form"></f:ajax>
</p:selectManyCheckbox>

这可以通过后端的 valueChangeListener 进行备份。

Java Code:
public void checkListener(ValueChangeEvent e) 
    System.out.println(e.getNewValue().toString());
    System.out.println(e.getOldValue().toString());


每次您选中或取消选中复选框时,您都可以获得选中和未选中的条目。

希望对你有帮助!

【讨论】:

感谢您的建议。我已经使用了 ValueChangeListener 以及在 jsf 中定义的 SelectManyCheckbox 的 ajax 事件侦听器,但在这种情况下(因为数据的动态性质),我必须在支持 bean 中创建 SelectManyCheckbox。是否可以为在支持 bean 中创建的 SelectManyCheckbox 使用 ValueChangeListener 和 ajax 事件?

以上是关于为啥没有为 primefaces SelectManyCheckbox 调用事件侦听器?的主要内容,如果未能解决你的问题,请参考以下文章

没有列过滤器的 primefaces 全局过滤器

primefaces上传没有做任何事情[重复]

IBM Bluemix 支持 Primefaces? [关闭]

如果在primefaces中禁用复选框值,则该值将为false

使用 JSF2.0 和 Primefaces 3.4 进行导航

没有TagLibrary与PrimeFaces的命名空间相关联