2010-08-27 115 views
21

昨天開始使用jQuery和jsTree插件,並通過對servlet的AJAX調用成功加載樹。現在,我想讓樹加載後打開所有節點,所以我向ajax屬性添加了成功函數。但是,我似乎無法使open_all()方法正常工作。我對使用jQuery非常陌生,所以我猜測這很簡單,我做錯了。爲什麼不jsTree open_all()爲我工作?

Firebug沒有顯示任何錯誤,這些錯誤排除了錯誤鍵入的方法名稱的愚蠢錯誤。我檢查了文檔,並且我認爲根據我閱讀的內容我正在做所有事情。樹正在正確加載,但不會在加載頁面後打開所有節點。

我在Firefox 3.6.8上使用jQuery 1.4.2和jsTree 1.0rc2。

下面是我使用加載樹,並試圖在樹打開所有節點的代碼:

// Create the tree object 
$("td#modelXML").jstree({ 
    core : { "animation" : 0 }, 
    //xml_data : {"data" : "" + xml, "xsl" : "nest"}, 
    xml_data : {"ajax" : 
        {"url" : "servlet/GetModelHierarchy", 
        "type" : "post", "data" : { modelId : "" + modelId} }, 
        "xsl" : "nest", 
        "success" : function(){ 
           $(this).open_all(-1); 
           } 
    }, 
    themes : {"theme" : "classic", "dots" : true, "icons" : true}, 
    types : { 
     "types" : { 
      "category" : { 
       "valid_children" : ["factor"] 
      }, 
      "factor" : { 
       "valid_children" : ["level"] 
      }, 
      "level" : { 
       "valid_children" : "none", 
       "icon" : { 
        "image" : "${request.contextPath}/jsTree/file.png" 
       } 
      } 
     } 
    }, 
    plugins : ["themes", "types", "xml_data"] 
}); 

回答

38

你必須掛鉤到的事件,然後調用open_all

要讓所有節點上的負載開放,使用方法:

var tree = $("#id-or-selector-for-my-tree-element"); 
    tree.bind("loaded.jstree", function (event, data) { 
     tree.jstree("open_all"); 
    }); 

做好以上,您.jstree({...})初始化樹前。

如果刷新它,那麼有開放的所有節點再次,你必須使用:

tree.bind("refresh.jstree", function (event, data) { 
     tree.jstree("open_all"); 
    }); 
20

是的,這是一個老問題,但沒有公認的答案,並具有不是唯一的答案對我有用,這裏是我的回答,我現在使用:

var tree = $("td#modelXML") 
    .bind("loaded.jstree", function (e, data) { 
     data.inst.open_all(-1); // -1 opens all nodes in the container 
    }) 
    .jstree({ /* your jsTree options as normal */ }); 

這裏的關鍵點是,data.inst是你jsTree,並且是唯一的參考,因爲tree將不會有價值,直到.jstree({完成。由於在.jstree({調用中調用loaded.jstree,結果將不存在。看到?

+3

+1此方法適用於我,接受的答案沒有。 – RedFilter 2012-02-01 17:05:33

+0

無論如何,刷新後使這項工作?加載的事件似乎不會觸發。有沒有其他事件可以告訴數據何時加載? ('loaded.jstree',函數(事件,數據){ data.instance.open_node('0') })' – Jens 2012-08-24 04:43:05

+0

)由於某些原因,這不適合我 – KeepCalmAndCarryOn 2014-03-25 03:21:58

1

試試這個!

$("td#modelXML").jstree("open_all","#nodeID"); 
+0

(對於jstree v3,現在需要這個( – user367134 2013-02-18 16:33:37

2

我完全無法得到它要麼tree.jstree('open_all')data.inst.open_all(-1)工作 - 在最後,我不得不使用data.instance.open_all() - 注意從研究所到實例的變化,open_all(-1),以剛剛open_all() - 這兩個似乎都是jQuery 1.11和jstree 3.0.0所必需的。我的最終代碼塊如下所示:

$(document).ready(function() { 
    var tree = $('#jstree'); 
    tree.bind('loaded.jstree', function(event, data) { 
     data.instance.open_all(); 
    }); 
    tree.jstree({}); 
});