2012-04-26 1 views
1

내 요구 사항 중 하나는 jstree에서 선택된 노드의 모든 자식 노드를로드하고 그 아래에있는 리프 노드의 모든 앵커 요소 ID를 반환하는 것입니다. 선택한 노드를 open_all 메서드에 전달하면 open_all 이벤트에서 리드 노드 ID를 반환하므로이 작업을 수행 할 수 있습니다. 그러나, 내 문제는 선택된 노드가 루트가 아닌 노드가 아닌 경우 open_all 이벤트가 두 번 발생하는 것입니다. 선택한 노드가 루트 또는 리프이면 제대로 작동합니다. 어떤 도움이라도 대단히 감사합니다.jstree open_all 이벤트가 두 번 발생합니다.

$tree 
    .bind("loaded.jstree", function(event, data) { 
     //alert("Tree loaded"); 
    }) 
    .bind("select_node.jstree", function(event, data) {    
     data.inst.open_all(data.rslt.obj, true); 
    }) 
    .bind("check_node.jstree", function(event, data) { 
     //checkboxes are enabled on some pages 
     data.inst.open_all(data.rslt.obj, true); 
    }) 
    .bind("open_all.jstree", function(event, data) { 
     //get all ids of leaf nodes under selected node if selected node is 
     //non-leaf node. If selected node is a leaf node return it's id. 

     //alert(leaf_ids); 

     //**Here is my problem:** The alert box pops up twice if 
     //open_all was passed a non-leaf node other than root.The first time 
     //ids are empty but the second time I see the ids.   
    }) 
    .jstree({ 
     "plugins": plugins_include, 
     "core": core_options, 
     "html_data": html_data, 
     "themes": { 
      "theme": "classic", 
      "dots": false, 
      "icons": false 
     }, 
     "strings": { loading: "Loading..." }, 
     "checkbox": { 
      "override_ui": true 
     }, 
     "ui": { "select_multiple_modifier": false } 
    }); 

답변

1

open_all을 사용하여 바인딩하는 더 깊은 이유가 있는지 모르겠지만 open_node도 옵션입니다.

.bind("open_node.jstree", function (event, data) { 
    var node = $(data.rslt.obj); 
    var nodeID = node.attr('id'); 

    var children = $.jstree._reference(node)._get_children(node); 
    if (children.length==0){ 
    // Dynamically load node since it has nothing loaded yet 
    } 
}) 
1

문제점을 해결하기 위해 jstree 플러그인의 open_all 메소드를 수정해야했습니다. this.is_open (original_obj)이 콜백이 모든 노드가
경우 (this.is_open (original_obj) 공개 된 후 해고

// 있도록 :

나는 open_all 함수의 마지막 줄에 또 하나 개의 조건을 추가 & &
original_obj.find ('li.jstree-closed'). 길이 === 0) {this .__ callback ({ "obj": original_obj}); }

내가 변경 한 후 알림 상자가 두 번 터지는 것을 멈췄습니다.