2013-02-19 27 views
0

我有一個用jstree製作的樹,它在展開節點時通過json_data插件部分加載並加載。下面的代碼的癥結所在:用jjree負載編程擴展jstree中的節點

$("#TreeViewDiv") 
.jstree(
{ 
    json_data: 
    { 
     ajax: 
     { 
      url: "/Website/GetNodes", 
      data: function (node) { 
       //do some stuff to compile data for backend here 

       return { 
        //insert data for backend here 
       }; 
      }, 
      error: function() { 
       $("#TreeViewDiv").html("Error initializing tree"); 
      } 
     } 
    }, 

    plugins: ["json_data", "ui"] 
}); 

然後我想擴大一些節點,選擇葉節點,這取決於用戶訪問該網站。我這樣做是在一個循環如下:

var nodeValues = [Parent, firstChild, leaf]; 

     for (var j = 0; j < nodeValues .length-1; j++) {   
      $("#TreeViewDiv").jstree("open_node", $("input[value='" + nodeValues [j] + "']")); 
     } 

打開父節點工作正常,並顯示該樹時則firstChild暴露,但則firstChild結點不開。如果我再次啓動循環,那麼firstchild會成功打開以顯示葉節點。

我的猜測是請求尚未完成,並且firstChild樹節點在上述循環嘗試打開時不存在。有沒有辦法在嘗試打開下一個節點之前等待節點加載?謝謝!

回答

2

好吧,所以我最終找到了答案。這是一種使用延遲來實現的方法。有可能是一個更合適的方法,但與此如此重構玩了一天後,我的頭很痛將不得不等待:)

var deffereds = $.Deferred(function (def) { def.resolve(); }); 

var nodeValues = [Parent, firstChild, leaf]; 

for (var j = 0; j < nodeValues .length-1; j++) { 
deffereds = (function(name, deferreds) { 
       return deferreds.pipe(function() { 
        return $.Deferred(function(def) { 
                $("#TreeViewDiv").jstree("open_node", $("input[value='" + name + "']"), function() { 
          def.resolve(); 
         }); 
        }); 
       }); 
      })(nodeValues [j], deffereds);  
} 

這基本上發起呼叫的推遲到open_node和使用回調從open_node功能解決延遲問題,確保在其父節點打開之前不打開任何節點。