gpt4 book ai didi

jsf - 应该在 p :tree to select a tree node and have a context menu? 上使用什么事件

转载 作者:行者123 更新时间:2023-12-05 09:20:49 25 4
gpt4 key购买 nike

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

我正在关注 example in the PrimeFaces showcase .如您所见,在 PrimeFaces 展示柜中,您可以立即右键单击一个节点,单击“查看”,growl 将显示正确的节点。

这是我的设置:

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>

我通过替换 JavaScript 中的 PrimeFaces.widget.BaseTree.nodeRightClick 函数解决了这个问题,以便在右键单击时触发 fireNodeSelectEvent

PrimeFaces.widget.BaseTree.prototype.nodeRightClick = function(e, a) {
PrimeFaces.clearSelection();
if ($(e.target).is(":not(.ui-tree-toggler)")) {
var d = a.parent(), b = a.hasClass("ui-tree-selectable");
if (b && this.cfg.selectionMode) {
var c = this.isNodeSelected(d);
if (!c) {
if (this.isCheckboxSelection()) {
this.toggleCheckboxNode(d)
} else {
this.unselectAllNodes();
// Fixed right click selecting
// original code: this.selectNode(d, true)
this.selectNode(d); // <-- Fix
}
}
this.fireContextMenuEvent(d)
}
}
}

这对我来说似乎是一个错误,所以我创建了一个 issue在 GitHub 上。此问题已关闭,因为“无法修复”并附有评论“请使用 contextMenu 事件”。

我已经检查了两次文档的树和上下文菜单部分。应该在哪里使用什么事件?我有 asked同样的问题在 GitHub 上,但是没有回应。

最佳答案

阅读issue you reported ,我调查了代码(它开放的)。似乎 p:tree 有一些未记录的事件,contextMenu 是其中之一(dragdrop 是另一个)。

5.3 java-source5.3 javascript-source包含对 contextMenu 事件的引用,因此

<p:ajax event="contextMenu" listener="#{myBean.onContextMenu}" />

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

会起作用。请注意,没有 ContextMenuEvent 但它接受/需要 NodeSelectEvent

关于jsf - 应该在 p :tree to select a tree node and have a context menu? 上使用什么事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35792709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com