私はajax呼び出しでjstreeプラグインを使用しています。ある時点で、私は電話します
$("#tree").jstree("refresh");
ajax 呼び出しによって作成された新しいノードを取得するため。select_node.jstree が更新時にトリガーされることを除いて、これはうまく機能します。ツリーの更新時に select_node がトリガーされないようにする方法はありますか?
リフレッシュする前にフラグをtrueに設定し、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
}
});
ツリーを更新する前にノードの選択を解除すると機能します。
bool の問題は、現在選択されているノードに子ノードがある場合、子ノードごとに select_node.jstree がトリガーされることです。
代わりに、refresh-function には2 つのパラメーターがあります。2 つ目は、すべての可視ノードを含む core.selected 配列を持つ状態オブジェクトを受け取る bool または関数にすることができます。配列を空にして状態を返すと、select_node.jstree はまったくトリガーされません。
var tree = $('#mytree').jstree(true);
tree.refresh(false, function (state) {
//console.dir(state);
state.core.selected = [];
return state;
});
または、更新後にすべてのノードの選択を解除できます
refresh=true;
$("#tree").jstree("refresh");
$("#tree").jstree("deselect_all");
これはうまくいくはずです!
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())にコメントしました。それが最適な解決策だとは思わないが、私の問題は解決した。