具有复选框模式的Primefaces树 - 从Managed Bean设置多个子节点

时间:2016-03-28 10:09:02

标签: jsf primefaces

我想在同一父节点下设置多个子节点进行选择或检查标记。我看到了这个答案:https://stackoverflow.com/a/17025086/1297935并尝试了以下内容并且它不起作用:

@ManagedBean
@ViewScoped
public class BackingBean extends GenericViewBean {

        private TreeNode[] selectedNodes;

        public void showChildSelected(){
             ...
             ...
             selectedNodes = new TreeNode[]{p1child1,p1child2}; //two child nodes of same parent added
             ...
             ...
             for(TreeNode treeNode : selectedNodes){
                 treeNode.setSelected(true);
             }
             RequestContext.getCurrentInstance().update("listView:tree");
        }

}

以上代码仅显示最后选中/选中的子项。是否有任何解决方案从Managed Bean中选择同一父节点的多个子节点? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为这似乎是Primefaces中的一些错误,因为Managed Bean中的TreeNode [] selectedNodes正确地显示了2个选定的节点,但在Javascript对象中,PrimeFaces.widgets.treeWidget.selections数组只显示了一个rowKey。仅当选择了同一父项的2个子项时才会发生这种情况。即使在Managed Bean中使用setSelected(true)手动选择treenode之后,行为也没有变化。

目前我正在使用alexSunder发布的Javascript解决方法:https://stackoverflow.com/a/25716716,在他的帖子中他正在使用PrimeFaces.widgets.treeWidget.selectNode(节点,静默),但我看了一下tree.js并得到了复选框的另一种方法:PrimeFaces.widgets.treeWidget.toggleCheckboxNode(node)。以下是我做的改变,它正在工作!!

@ManagedBean
@ViewScoped
public class BackingBean extends GenericViewBean {

        private TreeNode[] selectedNodes;

        public void showChildSelected(){
             ...
             ...
             selectedNodes = new TreeNode[]{p1child1,p1child2}; //two child nodes of same parent added
             ...
             ...
             for(TreeNode treeNode : selectedNodes){
                 StringBuilder sb = new StringBuilder();
                 sb.append("PrimeFaces.widgets.treeWidget.toggleCheckboxNode(");
                 sb.append("$(\"#listView\\\\:tree\\\\:");
                 sb.append(treeNode.getRowKey());
                 sb.append("\"))");
                 RequestContext.getCurrentInstance().execute(sb.toString());
             }
             RequestContext.getCurrentInstance().update("listView:tree");
        }

}

方法描述:
PrimeFaces.widgets.treeWidget.selectNode(node,silent):silent boolean参数作为false传递时,不会触发Node Select Event,但不会更改checkbox状态,只选择/突出显示Node。

PrimeFaces.widgets.treeWidget.toggleCheckboxNode(node):切换复选框状态以及选择Node,然后触发Node Select Event。