如何在PrimeFaces TreeTable中选择全部?

hel*_*123 5 jsf primefaces treetable

我有一个PrimeFaces树表,想添加一个复选框,允许用户选择/取消选择所有复选框。

这是我的xhtml的摘录

<p:selectBooleanCheckbox
        itemLabel="Select all"                                      
        value="#{mainViewBean.selectAll}">
        <p:ajax listener="#{mainViewBean.onSelectAll}"
            update="@this :mainForm" />
    </p:selectBooleanCheckbox>  

    <p:treeTable id="treeToAssign"
        value="#{mainViewBean.treeValue}" var="vh"
        selectionMode="checkbox"
        selection="#{mainViewBean.treeSelection}">
        <f:facet name="header">
            Tree Table                                                  
        </f:facet>                                                              
        <p:column>                                      
            <h:outputText value="#{vh.name}" />
        </p:column>                                 
    </p:treeTable>
Run Code Online (Sandbox Code Playgroud)

这是我的bean方法

private TreeNode treeValue;
private TreeNode[] treeSelection;
private boolean selectAll;

public void onSelectAll() {             
    List<TreeNode> selection = new ArrayList<>();
    for (TreeNode node : treeValue.getChildren()) {
    node.setSelected(selectAll);
        selection.add(node);
    }

    treeSelection = selection.toArray(new TreeNode[selection.size()]);
}
Run Code Online (Sandbox Code Playgroud)

我起初只是尝试设置NODE.setSelected(selectAll);,但没有用,所以我也尝试手动填充treeSelection

我觉得这应该很简单,但是一直无法弄清楚,有什么建议吗?

谢谢

Hat*_*mam 1

基本上,PrimeFaces 使用 treeTable 中的术语节点来引用每一行,它提供了一个 JavaScript 函数PrimeFaces.widget.TreeTable.selectNodesInRange(node)用于选择另一个节点范围内的所有节点,以及另一个取消选择所有节点的函数节点PrimeFaces.widget.TreeTable.unselectAllNodes()

因此,具有以下功能(用于选择全部,不需要用于取消选择,它已经存在):

function selectAllInTreeTable(widgetVar) {
   widgetVar.tbody.find('tr').each(function() {
      widgetVar.selectNodesInRange($(this));
   });
}
Run Code Online (Sandbox Code Playgroud)

假设您的widgetVartreeTable 是treeTableWV,并将 selectAll booleanCheckbox 调整为:

<p:selectBooleanCheckbox widgetVar="selectAllCheckBox" onchange="PF('selectAllCheckBox').isChecked()?PF('treeTableWV').unselectAllNodes():selectAllInTreeTable(PF('treeTableWV'))" >
   ...
</p:selectBooleanCheckbox>
Run Code Online (Sandbox Code Playgroud)

会做的。