如何在PrimeFaces TreeTable中选择所有?

时间:2015-11-18 16:59:01

标签: 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>

这是我的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()]);
}

我最初尝试设置NODE.setSelected(selectAll);,但这不起作用,所以我尝试手动填写treeSelection

我觉得这应该是直截了当的,但一直无法弄明白,有什么建议吗?

由于

2 个答案:

答案 0 :(得分:2)

  • 让你的bean至少@ViewScoped
  • 创建其他字段private Set<TreeNode> selectedNodesSet = new HashSet<>();
  • 使用递归选择/取消选择
public void onSelectAll() {
    for (TreeNode node : treeValue.getChildren()) {
        recursiveSelect(node);
    }

    treeSelection = new TreeNode[selectedNodesSet.size()];
    Iterator<TreeNode> iterator = selectedNodesSet.iterator();
    int index = 0;

    while (iterator.hasNext()) {
        treeSelection[index++] = iterator.next();
        iterator.remove();
    }
}

private void recursiveSelect(TreeNode node) {
    node.setSelected(selectAll);

    if (selectAll) {
        selectedNodesSet.add(node);
    } else {
        selectedNodesSet.remove(node);
    }

    for (TreeNode n : node.getChildren()) {
        recursiveSelect(n);
    }
}

答案 1 :(得分:1)

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

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

function selectAllInTreeTable(widgetVar) {
   widgetVar.tbody.find('tr').each(function() {
      widgetVar.selectNodesInRange($(this));
   });
}

并假设treeTable的widgetVartreeTableWV,并将selectAll booleanCheckbox调整为:

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

会这样做。