2012-08-22 1 views
1

jstree에 대한 json_data 구현을 사용하면 사용자가 트리에서 다른 노드를 열어 내용을 볼 수 있습니다. 기본적으로 이것은 :AJAX 성공 콜백에 잘못된 노드가있는 JSTree 경쟁 조건

   .jstree({ 
       "plugins" : [ "json_data", "ui" ], 
       "ui" : { "select_multiple_modifier": "on", 
         "selected_parent_close": "deselect" }, 
       "json_data" : { 
        "ajax" : { 
         "url": function(node) { 
          ... return a url ... 
         }, 
         "success": function(metadata, textStatus, jqXHR) { 
          var parent = this._get_node(); // <- RACE CONDITION 
          return parseMetaDataNodes(metadata, parent); 
         } 
        } 
       } 

사용자가 어떻게 든 첫 번째 반환에 대한 AJAX 응답하기 전에 두 개의 노드를 클릭하면, 그것은 둘 다 행동을 깨고 트리에서 동일한 "부모"를 가지고 있다고 생각합니다. 성공 콜백에서 올바른 노드를 얻을 수있는 더 좋은 방법

  1. :

    사람은 하나를 알고 있나요?

  2. 트리를 잠궈 서 첫 번째 반환까지 클릭을 수락하지 않는 방법?

답변

2

나는 비슷한 문제로 실행 (. 덜 바람직하지만, 너무 작동 할 수), 나는 즉 플래그가 클리어 될 때까지 실행에서 더 select_node 기능을 방지하기 위해, 두 번째 솔루션으로가는 결국 :

$("#treeHost").jstree({Your Plugin setup code}).bind("before.jstree", function(event, data) { 
       if (data.func == "select_node" && !canSelectNodes) { 
        event.stopImmediatePropagation(); 
        return false; 
       } 
      }) 

공식 문서에 따르면 before.jstree은 작업을 실행하지 못하도록 바인딩 할 수있는 특별한 이벤트입니다. 함수가 실행되는지 확인하려면 select_node이고, 그렇다면 canSelectNodes이 거짓 인 경우 실행하지 마십시오.

이 방법을 사용하면 노드 선택을 허용하지 않으려면 canSelectNodes 플래그를 코드의 다른 곳에서 false로 전환 할 수 있습니다.

+0

JSTree가 빌드 한 후에도 JSTree가 노드를 캐시하므로 특히 선택 취소 및 재 선택이 빠르기 때문에 생각했던 것처럼 사용자 경험이 좋지 않습니다. 오픈 소스 프로젝트에 대한 의견은 https://github.com/carterpage/yoga/commit/aef8b68fe9eeb71f302e2bfc1b916e357330b717에 있습니다. –