JsTreeの特定のノードを開く関数を記述しようとしていますが、ベースツリーがajax呼び出しから読み込まれる前に関数が実行されるという問題があります。 jstreeデータがロードされたかどうかを確認し、ロードが完了するまで待つにはどうすればよいですか。以下は私が使用しようとしている機能です。
function openNodes(tree, nodes) {
for (i in nodes) {
$('#navigation').jstree("open_node", $(nodes[i]));
}
}
次のコマンドで初期ツリーをロードしています
$("#navigation").jstree({
"json_data": {
"ajax": {
"url": function(node) {
var url;
if (node == -1) {
url = "@Url.Action("BaseTreeItems", "Part")";
} else {
url = node.attr('ajax');
}
return url;
},
"dataType": "text json",
"contentType": "application/json charset=utf-8",
"data": function(n) { return { id: n.attr ? n.attr("id") : 0, ajax: n.attr ? n.attr("ajax") : 0 }; },
"success": function() {
}
}
},
"themes": { "theme": "classic" },
"plugins": ["themes", "json_data", "ui"]
});
私はsetIntervalとclearIntervalを使用しました:
var interval_id = setInterval(function(){
// $("li#"+id).length will be zero until the node is loaded
if($("li#"+id).length != 0){
// "exit" the interval loop with clearInterval command
clearInterval(interval_id)
// since the node is loaded, now we can open it without an error
$("#tree").jstree("open_node", $("li#"+id))
}
}, 5);
JStreeの「.loaded」コールバックは、ルートノードに対してのみ機能します。 "._is_loaded"はノードの長さをチェックする代わりに機能するかもしれませんが、私は試していません。どちらの方法でも、アニメーション設定により、ツリーのより深いノードが数ミリ秒後に読み込まれます。 setIntervalコマンドは、目的のノードが読み込まれたときに終了するタイミングループを作成します。
要素で.jstree()を呼び出す前に、コールバックをbefore.jstree
およびloaded.jstree
イベントにバインドできます。
$(selector)
.bind('before.jstree', function(e, data) {
// invoked before jstree starts loading
})
.bind('loaded.jstree', function(e, data) {
// invoked after jstree has loaded
$(this).jstree("open_node", $(nodes[i]));
})
.jstree( ... )
Jstreeの最新バージョンでは、すべてのノードの読み込みが完了するまで、それらと対話する前に待機する必要がある場合があります。これを行うには、次のものが必要です。
ready.jstree
そう:
$(selector)
.bind('ready.jstree', function(e, data) {
// invoked after jstree has loaded
})
...
$ .ajax()関数を呼び出して最初に必要なデータを取得することをお勧めします。コードのうなり声のように、success:フィールドで$()。jstree()関数を呼び出すことができます。
var fullTree;
$.ajax({
url :"./php/select_tree.php",
data : fullTree,
method : "GET",
dataType : "json",
success : function(fullTree){
$("#jstree").jstree({
"core" : {
"data" :fullTree,
"check_callback" : true
},
"plugins" : [ "contextmenu", "dnd", "changed", "wholerow" ]
});
}
})
;
私の場合、_refresh.jstree
_イベントを使用します(jstreeのノードを頻繁に動的に変更および更新する必要があります)。
Docomentによると、それは
更新呼び出しが完了したときにトリガーされます
サンプルコード:
$.post( [url], ... ).done(function(){ $jstree.jstree().settings.core.data = result; $jstree.jstree().refresh(); }); $(selector).on('refresh.jstree', function(){ // do something });
間隔を追加する必要はありません。プラグインは、ajaxを介してロードしているノードにクラスを設定します。
.one("reselect.jstree", function (evt, data) {
if ($("#MYTREEID").find(".jstree-loading").length == 0) {
alert('my ajax tree is done loading");
}
})
[免責事項:状態プラグインはセットアップコードにリストされていないため、これはOPには適用されません。]
状態プラグインを使用している場合は、ready.jstreeまたはloaded.jstreeイベントの代わりにstate_ready.jstreeイベントを使用してください。
$(selector).on('state_ready.jstree', function () {
// open desired node
})