0

ノードを展開すると、部分的に読み込まれ、json_dataプラグインを介して読み込まれるjstreeで作成されたツリーがあります。コードの要点は次のとおりです。

$("#TreeViewDiv")   
.jstree(
{
    json_data:
    {
        ajax:
        {
            url: "/Website/GetNodes",
            data: function (node) {
                //do some stuff to compile data for backend here

                return {
                    //insert data for backend here
                };
            },
            error: function () {
                $("#TreeViewDiv").html("Error initializing tree");
            }
        }
    },

    plugins: ["json_data", "ui"]
});

次に、サイトにアクセスしているユーザーに応じて、いくつかのノードを展開し、リーフノードを選択します。私はこれを次のようにループで行います:

var nodeValues = [Parent, firstChild, leaf];

        for (var j = 0; j < nodeValues .length-1; j++) {        
            $("#TreeViewDiv").jstree("open_node", $("input[value='" + nodeValues [j] + "']"));
        }

親ノードを開くことは正常に機能し、ツリーが表示されているときにfirstChildが公開されますが、firstChildノードは開かれていません。ループを再度開始すると、firstchildが正常に開き、リーフノードが表示されます。

私の推測では、上記のループがリクエストを開こうとしたときに、リクエストが完了しておらず、firstChildツリーノードが存在していません。次のノードを開こうとする前に、ノードがロードされるのを待つ方法はありますか?ありがとうございました!

4

1 に答える 1

2

わかりました、それで私は最終的にそれを理解しました。延期でそれを行う方法は次のとおりです。おそらくもっときちんとした方法がありますが、これで遊んだ1日後に頭が痛くなるので、リファクタリングは待たなければなりません:)

var deffereds = $.Deferred(function (def) { def.resolve(); });

var nodeValues = [Parent, firstChild, leaf];

for (var j = 0; j < nodeValues .length-1; j++) {  
deffereds = (function(name, deferreds) {
                return deferreds.pipe(function () {
                    return $.Deferred(function(def) {
                                                    $("#TreeViewDiv").jstree("open_node", $("input[value='" + name + "']"), function () {
                            def.resolve();
                        });
                    });
                });
            })(nodeValues [j], deffereds);      
 }

これは基本的にopen_nodeへの呼び出しを遅延に置き、open_node関数からのコールバックを使用して遅延を解決し、親が開かれる前にノードが開かれないようにします。

于 2013-02-19T12:13:10.223 に答える