jsTree上下文菜单选择的项目?

时间:2012-05-07 12:06:16

标签: jstree

我们正在使用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;

...

我希望能清楚地描述我的问题。

提前致谢。

3 个答案:

答案 0 :(得分:3)

我使用的是jsTree 3.0.2,这个修复程序对我没用。

&#34; i&#34;参数已经包含在发送给&#34; action&#34;的结果中。函数,但它只包含有关单击的上下文菜单的详细信息,而不是绑定到该jsTree分支的JSON项。

enter image description here

要获取右键单击项目的ID,请按照以下步骤操作。

我树中的一些分支是文件夹,有些是报告(用户可以运行),所以我需要能够调整我的jsTree上下文菜单,具体取决于用户右键单击的节点类型,对于报告,我需要获取所选记录的ID。

enter image description here

首先,我编写了一个小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函数。

enter image description here

关键是填充此树的JSON数据专门在jsTree的ReportID属性中添加了li_attr属性。

enter image description here

因为我们的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        
                    ....
                }
                ....
            }
            ....
        }

谢谢!