1

私はこれに何時間も注いでいますが、まだ多くの進歩を遂げていないので、SOの素晴らしい住人の1人が私を助けてくれることを望んでいました. これが問題です...

jQueryのjstreeプラグインを介してツリーを実装しています。基本的に次のように、asp:HiddenField にダンプされた json を介して、webapp からプログラムでツリーにデータを取り込むデータを取得しています。

JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(Items);

json = json.ToLower();
data.Value = json;    

次に、ツリーは非表示フィールドから json をプルして、それ自体を構築します。これは、ノードが選択/開かれたデータを永続化しようとするまで、完全に正常に機能します。問題を単純化するために、いくつかの json データをツリーにハードコーディングし、Cookie プラグインを使用してツリー状態データを永続化しようとしました。これは、何らかの理由で機能しません。人々がプラグインを特定の順序でロードする必要があるなどの問題を見てきましたが、これは私の問題を解決しませんでした。html_data で同じセットアップを試してみましたが、完全に機能します。この作業永続性を使用して、Cookie プラグインを変換して、データを別の asp:hiddenfield に永続化しました (アプリケーションでは、この種のものに Cookie を使用することはできません)。

基本的に Cookie の操作は同じで、ノードの配列を非表示フィールドの値として保存するだけです。これは html_data では機能しますが、まだ json では機能しません。失敗している場所をまだ特定できていません。

これは jQuery.cookie.js の置き換えです。

jQuery.persist = function(name, value) {
    if (typeof value != 'undefined') { // name and value given, set persist
        if (value === null) {
            value = '';
        }
        jQuery('#' + name).attr('value', value);
    } else { // only name given, get value
        var persistValue = null;
        persistValue = jQuery('#' + name).attr('value');
        return persistValue;
    }
};

jstree.cookie.js コードは、いくつかの変数名の変更を除いて同一です。そして、これは私のツリーです:

$(function() {
                $("#demo1").jstree({
                    "json_data": {
                        "data" : [
                        {
                            "data" : "A node",
                            "children" : [ "Child 1", "Child 2" ]
                        },
                        {
                            "attr": { "id": "li.node.id" },
                            "data" : {
                                "title": "li.node.id",
                                "attr": { "href": "#" }
                            },
                            "children": ["Child 1", "Child 2"]
                        }
                    ]
                    },
                    "persistence": {
                        "save_opened": "<%= open.ClientID %>",
                        "save_selected": "<%= select.ClientID %>",
                        "auto_save": true
                    },
                   "plugins": ["themes", "ui", "persistence", "json_data"]
                });
            });

データは隠しフィールドに適切に保存されていますが、問題はポストバックで発生し、ノードを再度開きません。どんな助けでも大歓迎です。

これをもう少し調べた後、永続化操作が試行されているときに、JSON_data からツリーがまだ構築されていないことが問題であるように思われることを説明したかっただけです。ツリーが完全にロードされるまでこれらのアクションを延期する方法はありますか?

4

2 に答える 2

1

JSONデータで正しく機能するようになりました。jstree自体の中で「reopen」および「reselect」関数を編集する必要がありました。

これが、それを必要とする人のための新しい機能する再開機能です。

reopen: function(is_callback) {
                var _this = this,
                    done = true,
                    current = [],
                    remaining = [];
                if (!is_callback) { this.data.core.reopen = false; this.data.core.refreshing = true; }
                if (this.data.core.to_open.length) {
                    $.each(this.data.core.to_open, function(i, val) {
                        val = val.replace(/^#/, "")
                        if (val == "#") { return true; }
                        if ($(("li[id=" + val + "]")).length && $(("li[id=" + val + "]")).is(".jstree-closed")) { current.push($(("li[id=" + val + "]"))); }
                        else { remaining.push(val); }
                    });
                    if (current.length) {
                        this.data.core.to_open = remaining;
                        $.each(current, function(i, val) {
                            _this.open_node(val, function() { _this.reopen(true); }, true);
                        });
                        done = false;
                    }
                }
                if (done) {
                    // TODO: find a more elegant approach to syncronizing returning requests
                    if (this.data.core.reopen) { clearTimeout(this.data.core.reopen); }
                    this.data.core.reopen = setTimeout(function() { _this.__callback({}, _this); }, 50);
                    this.data.core.refreshing = false;
                }
            },

問題は、それが見つけようとしていたことでした

  • カスタム属性による要素。ノードオブジェクトを予期していたときに、これらの文字列を配列にプッシュして検索していました。この行を使用する

    if ($(("li[id=" + val + "]")).length && $(("li[id=" + val + "]")).is(".jstree-closed")) { current.push($(("li[id=" + val + "]"))); }
    

    それ以外の

    if ($(val).length && $(val).is(".jstree-closed")) { current.push(val); }
    

    かかったのはそれだけでした。同様のプロセスを使用して、選択したノードをこの方法でも永続化することができました。

    これが誰かの助けになることを願っています。

  • 于 2010-09-03T19:03:08.640 に答える