jstree上下文菜单动作评估

时间:2011-07-29 09:17:38

标签: javascript jstree

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

                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']);

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

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' } }

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

现在我是在js开始的,所以也许我错过了一些基本的东西。任何建议将不胜感激。

此致 波格丹

2 个答案:

答案 0 :(得分:0)

好的我做了这个工作,但只使用eval来获取在创建时评估的参数。所以我的解决方案看起来像:

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

答案 1 :(得分:0)

你可以在动作功能上使用一个闭包。例如:

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