我正在使用上下文菜单创建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();
}
<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>
答案 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事件监听器。
请参阅: