2012-04-12 56 views
2

當一起使用lazyloading特性和open_all特性時,我們遇到問題。Jstree加載並展開所有問題

樹的內容使用延遲加載功能加載。

當我們選擇一個節點並單擊展開所有按鈕時,將使用jstree ajax調用獲取該節點的所有子節點,並使用open_all函數打開,當單擊摺疊所有按鈕時,我們使用close_all函數。這是第一次完美的作品。

但是第二次,當我們點擊展開所有在同一個節點上時,同樣的ajax url被遞歸地擊中。 (我們認爲,每次使用open_all打開節點時都會觸發該URL)。預期的行爲不是調用url(因爲數據已經加載),只應該執行open_all函數。

請您闡明如何解決這個問題

//代碼加載樹

$("#TreePanel").jstree({ 
    "xml_data" : { 
     "ajax" : { 
      "url" : "/ajax/loadTree", 
      "type" : "post", 
      "data" : function(node) { 
       var data = {};    
       data.dunsNumber = ${dunsNumber}; 
       if (node == -1) { 
        //set duns number to data 
       } else { 
        data.selectedNodeId = node.attr("id"); 
        data.expandAll = isExpandAll; 
       } 
       return data; 
      }, 
      "success" : function(data) { 
       if ($(data).attr('id') == 'error') { 
        $("#overlayContent").empty();      
       } else { 
        return data; 
       } 
      } 
     }, 
     "xsl" : "nest" 
    }, 
    "plugins" : [ "themes", "xml_data" ] 
}); 


     //code to expand all nodes 


     $("#ufvExpandAll").bind("click", function() { 
    isExpandAll= true; 
    $("#TreePanel").jstree("open_all", selectedNode); 
    isExpandAll= false; 
    }); 

     //code to collapse all nodes 

$("#ufvCollapseAll").bind("click", function() { 
    $("#TreePanel").jstree("close_all", selectedNode); 
}); 

    //code to get the node and set on a variable on clicking a node 

     var selectedNode; 
$("#TreePanel").delegate("a", "click", function(e, data) { 
    var node = $(e.target).closest("li"); 
    if (selectedNode != undefined && selectedNode != null) { 
     $("#" + selectedNode.id + " > a").removeClass("jstree-default-    selected-node"); 
    } 
    selectedNode = node[0]; 
    $("#" + selectedNode.id + " > a").addClass("jstree-default-selected-     node"); 
     $("#ufvExpandAll").attr("disabled", false); 
    $("#ufvCollapseAll").attr("disabled", false); 
    return false; 
}); 

在此先感謝

問候 哈日

回答

1

嘗試檢查節點在執行邏輯將其加載到子項之前查看它是否有任何預先存在的子項。

.bind("open_node.jstree", function (event, data) { 
    var node = $(data.rslt.obj); 
    var children = $.jstree._reference(node)._get_children(node); 
    if (children.length==0){ 
    //node is empty, so do node open logic here 
    } 
})