我正在使用上下文菜单创建PrimeFaces(5.3)树。选定的节点应存储在中#{myBean.selectedNode}
。当我使用鼠标左键选择一个节点时,将设置正确的节点。但是,当我尝试从上下文菜单上的节点上运行某个动作时,如果没有先选择它,就不会设置正确的节点(不会调用bean中的setter)。
我遵循PrimeFaces展示柜中的示例。如您所见,在PrimeFaces展示柜中,您可以立即右键单击一个节点,然后单击“查看”,并且咆哮声将显示正确的节点。
这是我的设置:
是的ViewScoped
,有一个private TreeNode selectedNode
带有getter和setter的对象。
以下是有趣的部分:
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();
}
<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>
通过替换PrimeFaces.widget.BaseTree.nodeRightClick
JavaScript中的函数以触发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)
}
}
}
对我来说,这似乎是一个错误,因此我在GitHub上创建了一个问题。此问题已通过注释“请使用contextMenu事件”作为“无法解决”而关闭。
我已经检查了文档的tree和contextMenu部分两次。什么事件应该在哪里使用?我在GitHub上问了同样的问题,但没有任何回应。
阅读您报告的问题,我调查了该代码(此代码是开放的)。似乎p:tree
有一些未记录的事件,contextMenu
是其中一个(dragdrop
另一个)。
的5.3 java的源和5.3的JavaScript源包含引用到一个contextMenu
事件,所以
<p:ajax event="contextMenu" listener="#{myBean.onContextMenu}" />
和
public void onContextMenu(NodeSelectEvent event) {
MyTreeNode myTreeNode = (MyTreeNode) event.getTreeNode();
myController.setSelected(myTreeNode.getEntity());
}
将工作。请注意,没有,ContextMenuEvent
但是它接受/需要NodeSelectEvent
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句