【问题标题】:jstree context menu action evaluationjstree上下文菜单动作评估
【发布时间】:2014-08-04 17:17:40
【问题描述】:

所以我遇到了以下问题。我需要为我的 jstree 创建一个动态菜单。所以:

                var default_dict = { 
                                create: false, 
                                rename: false, 
                                remove: false, 
                                ccp: false
                              };    
                for (one in viewers) {
                    var details = viewers[one];
                    alert(details['module']);
                    alert(details['classname']);          
                    default_dict[one] = {                                   
                                        label: 'View in: ' + one,
                                        action: function (obj) { 

                                                    doLaunch($project.id, nodeId, obj.one.module, obj.one.classname, obj.attr("dataType"))
                                               },
                                        seperator_after: false,
                                        seperator_before: false
                                    }
                }
                return default_dict;

现在这是我的createMenuItems 函数的主要部分,它返回我的菜单项。现在我检查了,模块和类名在:

 alert(details['module']);
 alert(details['classname']);

但正如您所见,我希望每个项目的操作都是使用 it.s 对应模块和类名数据启动的。但是从我可以看到的实际评估中: 行动:

function (obj) { 

 doLaunch($project.id, nodeId, obj.one.module, obj.one.classname, obj.attr("dataType"))
                                           }, is done after the initialization of the tree. So now I'm in the following situation:

假设观众如下:

{ 'viewer1' : { 'module': 'Module_one', 'classname' : 'Classname_one' }, 'viewer2' : { 'module' : 'Module_two', 'classname' : 'Classname_two' } }

在树初始化中,它被正确解析,我得到标记为:“在 viewer1 中查看”和“在 viewer2 中查看”的项目。但是,当我单击“在 viewer1 中查看”并评估操作功能时,详细信息现在包含 Viewers2 模块和类名,因此完成了错误的启动。我希望我正确地解释了我的问题。

现在我是 js 的初学者,所以也许我缺少一些基本的东西。任何建议将不胜感激。

问候, 波格丹

【问题讨论】:

    标签: javascript jstree


    【解决方案1】:

    好的,我完成了这项工作,但仅通过使用 eval 来获取在创建时评估的参数。所以我的解决方案如下:

    eval("default_dict[one] = {label: '"+displayName+"', action: function(obj) {" + 
                     "doLaunch('" + url +"','"+ paramName+"', dataId);}}");
    

    【讨论】:

      【解决方案2】:

      您可以在此处对操作函数使用闭包。例如:

      action: function(obj) {
        var one = obj.one;//this will save the obj instance, even if later the action function is called with the jsTree node obj
        return function(){
          doLaunch(url, one.module, one.classname);//only this will get called 
        };
      }(obj);//this will call your function on each item in for loop
      

      【讨论】:

        猜你喜欢
        • 2013-06-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多