2011-07-29 66 views
2

所以我遇到了以下問題。我需要爲我的jstree創建一個動態菜單。所以: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 correspondig模塊和類名的數據發射。但是從我所看到的實際評測: 行動:

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中查看「。然而,當我點擊'在查看器1中查看'並且評估操作函數時,細節現在包含Viewers2模塊和classname,因此錯誤的啓動完成。我希望我能正確解釋我的問題。

現在我是在js開始,所以也許我失去了一些基本的東西。任何建議,將不勝感激。

問候, 波格丹

回答

0

好,我做這個工作,但只能使用一個eval來獲得在創建時評估的參數。所以我的解決方案如下所示:

eval("default_dict[one] = {label: '"+displayName+"', action: function(obj) {" + 
       "doLaunch('" + url +"','"+ paramName+"', dataId);}}"); 
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