调用上下文菜单操作时未设置选定的树节点

时间:2016-02-08 13:26:03

标签: jsf primefaces

我正在使用上下文菜单创建PrimeFaces(5.3)树。选定的节点应存储在#{myBean.selectedNode}中。当我使用鼠标左键选择节点时,设置了正确的节点。但是,当我尝试从上下文菜单中运行某个节点上的操作时,而不先选择,未设置正确的节点(我的bean中的setter未被调用)。

我正在关注example in the PrimeFaces showcase,我想我已经排好了所有内容。我做错了什么?

正如您所看到的,在PrimeFaces展示中,您可以立即右键单击节点,单击“查看”,然后咆哮将显示正确的节点。

我不认为bean代码是相关的(它是ViewScoped,并且有一个带有getter和setter的private TreeNode selectedNode

以下是有趣的内容:

public void onNodeSelect(NodeSelectEvent event) {
    MyTreeNode myTreeNode = (MyTreeNode) event.getTreeNode();
    myController.setSelected(myTreeNode.getEntity());
}

public void addChild(String name) {
    MyTreeNode myTreeNode = (MyTreeNode) selectedNode;
    MyTreeNode childNode = myTreeNode.addChild(name);
    myController.setSelected(childNode.getEntity());
    myController.insert();
}

XHTML

<h:form id="mainForm">
    <p:tree value="#{myBean.root}" var="node"
            id="myTree" dynamic="true"
            selectionMode="single" selection="#{myBean.selectedNode}">
        <p:treeNode expandedIcon="ui-icon-folder-open" collapsedIcon="ui-icon-folder-collapsed"
                    type="myType">
            <h:outputText value="#{node}"/>
        </p:treeNode>
        <p:ajax event="select" listener="#{myBean.onNodeSelect}" />
    </p:tree>

    <p:contextMenu for="myTree">
        <p:menuitem action="#{myBean.addChild('new')}"
                    value="Add"
                    process="@this"
                    update=":mainForm:myTree"/>
    </p:contextMenu>
</h:form>

2 个答案:

答案 0 :(得分:1)

HY,
是素数中的一个错误。
你可以自己解决这个问题。为此,您需要在按下鼠标按钮的primefaces js文件中添加验证。您可以覆盖项目中的文件primefaces.js,找到第一个调用函数selectNode(d)并添加以下检查:

if (e.which == 1) {
    this.selectNode(d)
    this.cursorNode = d;
}

这是您可以找到的代码的一部分然后函数nodeClick:函数(e,a)被调用:

nodeClick: function (e, a) {
    PrimeFaces.clearSelection();
    if ($(e.target).is(":not(.ui-tree-toggler)")) {
        var d = a.parent();
        if (this.cfg.onNodeClick) {
            this.cfg.onNodeClick.call(this, d)
        }
        if (a.hasClass("ui-tree-selectable") && this.cfg.selectionMode) {
            var c = this.isNodeSelected(d), f = e.metaKey || e.ctrlKey, b = e.shiftKey;
            if (this.isCheckboxSelection()) {
                this.toggleCheckboxNode(d)
            } else {
                if (c && f) {
                    this.unselectNode(d)
                } else {
                    if (this.isSingleSelection() || (this.isMultipleSelection() && !f)) {
                        this.unselectAllNodes()
                    }
                    if (this.isMultipleSelection && b) {
                    } else {
                        if (e.which == 1) {
                             this.selectNode(d);
                             this.cursorNode = d;
                        }
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

事实证明,您需要未记录的contextMenu Ajax事件监听器。

请参阅: