【问题标题】:Primefaces TreeTable doesnt update when adding new items to itPrimefaces TreeTable 在添加新项目时不会更新
【发布时间】:2021-10-12 23:02:25
【问题描述】:

我在更新 primefaces 树表时遇到问题。编辑节点的名称没有问题,但是当我添加或删除一个元素时,树视图没有更新。

elementsTreeView.xhtml 如下所示:

       <p:treeTable value="#{elementsTreeView.root}" var="node" dynamic="false" id="elements"
                     nodeVar="#{elementsTreeView.root}">
            <p:ajax event="collapse" listener="#{elementsTreeView.onNodeCollapse}" />
            <p:column headerText="#{labels['elements-tree-view.name']}"
                          sortBy="#{elementsTreeView.getCorrectNamingScheme(node)}" sortOrder="asc"
                          filterBy="#{elementsTreeView.getCorrectNamingScheme(node)}" filterMatchMode="contains"
                      selectionMode="single">
                <p:commandLink value="#{elementsTreeView.getCorrectNamingScheme(node)}"
                               action="#{elementsTreeView.navigateToEditElement(node)}"/>
                </p:column>
            <p:column headerText="#{labels['elements-tree-view.creation-date']}">
                <h:outputText value="#{node.creationDate.time}">
                    <f:convertDateTime type="date" pattern="dd.MM.yyyy hh:mm" />
                </h:outputText>
            </p:column>
            <p:column headerText="#{labels['elements-tree-view.position-in-folder']}"
                      >
                <h:outputText value="#{elementsTreeView.determinePositionInFolder(node)}"
                              rendered="#{not elementsTreeView.isFolder(node)}"/>
            </p:column>
            <p:column headerText="#{labels['elements-tree-view.actions']}">
                <p:commandButton icon="pi pi-plus"
                                 action="#{elementsTreeView.navigateToCreateFolder(node)}"
                                 rendered="#{elementsTreeView.isFolder(node)}" styleClass="table-button rounded-button"
                                 value="#{labels['elements-tree-view.create-folder']}"/>
                <p:commandButton icon="pi pi-plus" action="#{elementsTreeView.navigateToCreateNote(node)}"
                                 rendered="#{elementsTreeView.isFolder(node)}" styleClass="table-button rounded-button"
                                 value="#{labels['elements-tree-view.create-note']}"/>
                <br/>
                <p:commandButton icon="pi pi-pencil" action="#{elementsTreeView.navigateToEditElement(node)}"
                                 styleClass="table-button rounded-button" update="@form"/>
                <p:commandButton icon="pi pi-trash" action="#{elementsTreeView.deleteElement(node)}"
                                 styleClass="rounded-button ui-button-danger" update="@form"
                                 rendered="#{elementsTreeView.isFolder(node)}">
                    <p:confirm header="#{labels['elements-tree-view.confirmation']}"
                               message="#{labels['elements-tree-view.confirm-delete-folder']}"
                               icon="pi pi-info-circle"/>
                </p:commandButton>
                <p:commandButton icon="pi pi-trash" action="#{elementsTreeView.deleteElement(node)}"
                                 styleClass="rounded-button ui-button-danger"
                                 rendered="#{not elementsTreeView.isFolder(node)}">
                    <p:confirm header="#{labels['elements-tree-view.confirmation']}"
                               message="#{labels['elements-tree-view.confirm-delete-note']}"
                               icon="pi pi-info-circle"/>
                </p:commandButton>
            </p:column>
        </p:treeTable>

删除方法如下所示。我什至从树结构中删除了元素。它仍然没有改变:

public void deleteElement(final Element elementToBeRemoved){
    if(elementToBeRemoved instanceof Folder folder) {
        folderService.deleteFolder(folder);
    }
    else if (elementToBeRemoved instanceof Note note){
        noteService.deleteNote(note);
    }
    root.getChildren().removeIf(element->element.getData().equals(elementToBeRemoved));
    traverseTree(root, elementToBeRemoved);
}


public void traverseTree(final TreeNode tree, final Element elementToBeRemoved) {
    if(tree.getChildren().removeIf(element->element.getData().equals(elementToBeRemoved))){
        System.out.println("Entfernt");
        return;
    }
    for (final TreeNode child:tree.getChildren()){
        if (child.getData() instanceof Folder){
            traverseTree(child, elementToBeRemoved);
        }
    }
    initRoot();
}

如果您需要更多代码片段,请查看我的 bitbucket 公共项目。

最重要的文件:

  • 元素树(视图)
  • editNode(视图)
  • 编辑文件夹(查看)

[1] 项目链接:https://bitbucket.org/Samuel19982/smartorganizr/src/master/

任何帮助将不胜感激。

【问题讨论】:

  • 请提供minimal reproducible example(包括版本)
  • 您对如何做到这一点有什么建议吗?例如。用户参与每一个动作。我将不得不重写整个应用程序。
  • 所以我在过去的几个小时里尽量减少它。这不可能。如果我删除用户,整个应用程序就会像纸牌屋一样崩溃。如前所述,上述 3 个文件最相关。
  • 至少包括版本
  • 究竟是什么版本?版本的特点是什么?由于我是 stackoverflow 的新手,因此我可能不了解 Stackoverflow 命名法。

标签: jsf primefaces


【解决方案1】:

您可以尝试从后端更新您的 treeTable,方法是在您的 deleteElement 方法结束时调用 PrimeFaces.current().ajax().update("form:elements");

【讨论】:

  • 不幸的是,这对我不起作用。我在删除方法的最后添加了您的行。删除树中的一个元素时,什么也没有发生。
【解决方案2】:

由于 primefaces 提供了一种选择模式,我找到了一个临时解决方案来选择一个 Treenode 然后将其删除。删除方法如下所示:

public void deleteElement(){
    if(selectedTreeNode == null){
        JsfUtils.putErrorMessage(I18nExceptionUtils.getElementsTreeNoNodeSelected());
        return;
    }
    final Element elementToBeRemoved = (Element) selectedTreeNode.getData();
    handleDeletion(elementToBeRemoved);

    if(selectedTreeNode!=null) {
        selectedTreeNode.getParent().getChildren().remove(selectedTreeNode);
    }
}

其中 selectedTreeNode 是后端 Bean 中的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多