2013-02-19 2 views
0

jstree로 만든 트리가 부분적으로로드되고 노드를 확장 할 때 json_data 플러그인을 통해로드됩니다. 여기에 코드의 핵심입니다 :ajax로드로 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 기능에서 콜백을 사용 지연을 해결하여 부모가 열리기 전에 노드가 열리지 않도록하십시오.

관련 문제