我们正在使用jsTree(2011年2月9日修订版236)。
有没有人知道是否有办法访问与“行动”相关联的功能中选择的菜单项名称?
我想自动定义菜单项,以便根据上下文菜单中项目的标识符设置每个“动作”的功能。
例如,对于具有三个操作(“A”,“B”或“C”)的上下文菜单
...
var items = {};
for(var i=0; i < preconfiguredItemsData.length; i++)
{
var item = preconfiguredItemsData[i];
items[item.name] = {
"label": item.title,
"action": function (liNode) {
control = eval("new " + **SELECTED ITEM IDENTIFIER ?** + "()");
// **new A(), new B() or new C()** depending on the selected
// item on the context menu.
// I have the identifier of the jsTree node but ... how
// can I get the item id ("A", "B" or "C")?
control.execute();
},
"_class": "class",
"separator_before": false,
"separator_after": true,
"icon": false,
"submenu": {}
};
...
} //for
items.create = false;
items.rename = false;
items.remove = false,
items.edit = false;
items.ccp = false;
...
我希望能清楚地描述我的问题。
提前致谢。
答案 0 :(得分:3)
我使用的是jsTree 3.0.2,这个修复程序对我没用。
&#34; i&#34;参数已经包含在发送给&#34; action&#34;的结果中。函数,但它只包含有关单击的上下文菜单的详细信息,而不是绑定到该jsTree分支的JSON项。
要获取右键单击项目的ID,请按照以下步骤操作。
我树中的一些分支是文件夹,有些是报告(用户可以运行),所以我需要能够调整我的jsTree上下文菜单,具体取决于用户右键单击的节点类型,对于报告,我需要获取所选记录的ID。
首先,我编写了一个小getCustomMenu
函数来获取特定jsTree分支的上下文菜单项,因此,我将jstree
定义如下。
$('#divReportsTree').jstree({
"core": {
'data': JSON.Results.core.data
},
"plugins": ["contextmenu"],
"contextmenu" : {
// Call a function, to fetch the CustomMenu for this particular jsTree branch
items: getCustomMenu
},
})
我的getCustomMenu
函数看起来像这样:
function getCustomMenu(node) {
var thisReportID = node.li_attr.ReportID;
var items = {
Run: {
"separator_before": false,
"separator_after": true,
"label": "Run this report",
"icon": "/Images/Icons/Go.png",
"action": function (node, reportID) {
// Call a function to run a report, with a particular Report ID
RunReport(node, thisReportID);
}
},
Refresh: {
"separator_before": false,
"separator_after": false,
"label": "Refresh",
"icon": "/Images/Icons/Refresh.png",
"action": function (node, reportID) {
// Call a refresh function, with a particular Report ID
RefreshReport(node, thisReportID);
}
};
// If this is a jsTree node for a Folder (rather than a Report) then
// just show the "Refresh" ContextMenu item
if (node.li_attr.ReportID == null)
{
delete items.Run;
}
return items;
}
当用户右键点击jstree
中的报告时,getCustomMenu
函数会使用所选报告的ID调用我的RunReport
函数。
关键是填充此树的JSON数据专门在jsTree的ReportID
属性中添加了li_attr
属性。
因为我们的getCustomMenu
调用了动作函数(&#34; RunReport&#34;,在本例中),我们可以调整它以将额外的参数传递给此函数。
呼。
希望这一切都有所帮助(并且有意义!)
答案 1 :(得分:1)
有更简单的解决方案,无需修改jstree的源代码。我用 jstree 3.3.1 测试了这种方法。
来自docs(强调我的):
激活一个菜单项后,将使用包含以下键的对象调用action函数: item - 如下所示的contextmenu项目定义,reference - 使用的DOM节点( tree node),element - contextmenu DOM元素,position - 一个带有x / y属性的对象,指示菜单的位置。
item
属性是上下文菜单项的完整定义。这意味着您可以将任何属性附加到该对象,并在以后检索其值。在问题示例中,可能是_class
属性。目前尚不清楚OP是否尝试过这种方法。
var items = {
item1: {
label: 'a label',
icon: 'fa fa-font-awesome',
separator_after: true,
disabled: false,
action: lang.hitch(this, 'doSomething'),
_name: 'item1'
}
}
然后,_name
将在item
属性中传递。
doSomething: function (obj) {
console.log(obj.item._name)
}
答案 2 :(得分:0)
通过在原始jquery.jstree.js的函数调用中添加函数名作为参数来解决。
(function ($) {
$.vakata.context = {
.....
exec : function (i) {
....
if($.isFunction($.vakata.context.func[i])) {
....
$.vakata.context.func[i].call($.vakata.context.data, $.vakata.context.par, i); //Param 'i' added
....
}
....
}
....
}
谢谢!