2012-06-21 59 views
3

我正在使用jstree插件和ajax調用。在某些時候,我打電話給如何在不觸發select_)節點的情況下刷新jstree

$("#tree").jstree("refresh"); 

爲了檢索通過ajax調用創建的新節點。這很好,除了在刷新時觸發select_node.jstree。有沒有辦法來防止樹刷新觸發select_node?

+0

您對select_node.jstree有什麼不喜歡的? – Radek

回答

4

我結束了使用刷新之前設置一個標誌爲真,並在select_node事件觸發,只有在標誌被設置爲false,執行邏輯,否則將其設置爲false和別的什麼都不做:

refresh = true; 
$("#tree").jstree("refresh"); 

[...] 

$("#tree").jstree({...}).bind("select_node.jstree", function (e, data) { 
    if (refresh) { 
     refresh = false; 
    } else { 
     // do my thing 
    } 
}); 
+0

jstree現在有一個適合這個目的的'redraw'方法。 –

1

如果您正在使用UI插件,則refresh()函數「啓用在刷新之前保存選擇狀態並在之後進行恢復」。因此,如果當前選定節點(在刷新之前)是要刷新的節點的子節點,則狀態將在觸發reselect()函數刷新後恢復。刷新功能鎖這樣的:

refresh : function (obj) { 
      var _this = this; 
      this.save_opened(); 
      if(!obj) { obj = -1; } 
      obj = this._get_node(obj); 
      if(!obj) { obj = -1; } 
      if(obj !== -1) { obj.children("UL").remove(); } 
      else { this.get_container_ul().empty(); } 
      this.load_node(obj, function() { 
       _this.__callback({ "obj" : obj}); 
       _this.reload_nodes(); //this will trigger the reselect() function 
      }); 

我有同樣的問題,我評論說,線(_this.reload_nodes())。不要認爲這是一個最佳解決方案,但解決了我的問題。

2

或者你可以刷新

refresh=true; 
$("#tree").jstree("refresh"); 
$("#tree").jstree("deselect_all"); 

後取消選擇所有的節點這應該工作!

1

在刷新樹之前取消選擇節點將工作。

2

bool的問題是,如果當前選擇的節點有子節點,則會爲每個子節點觸發select_node.jstree。

相反,在刷新功能中有two parameters。第二個可以是一個bool或一個函數,它接收一個包含所有可見節點的core.selected數組的狀態對象。如果清空數組並返回狀態,則根本不會觸發select_node.jstree。

 var tree = $('#mytree').jstree(true); 

     tree.refresh(false, function (state) { 
      //console.dir(state); 
      state.core.selected = []; 
      return state; 
     }); 
相關問題