所以我遇到了以下问题。我需要为我的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开始的,所以也许我错过了一些基本的东西。任何建议将不胜感激。
此致 波格丹
答案 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