0

このデモを使用して、JqGrid の列にテキストとドロップダウン リスト フィルターを表示しています。グリッドにはリモート データ ソースがあり、各並べ替え、フィルター、またはページ ビューなどで、リモート ソースからデータを取得します。

私が抱えている問題は、新しいデータが到着するとグリッドが更新され、フィルターがデフォルトに戻ることです。オレグ博士によるいくつかの例を見てきましたが、リモートデータと永続性で動作させることができません。datatypeto"local"またはloadonceto を設定するとtrue、リモート データソースが壊れます。

これを機能させる方法のアイデアはありますか?

私は次のことを試しましたが、私が言ったように、これはJqGridがAPIリクエストを行うのを止めます:

loadComplete: function () {
    var $this = $(this);
    var postfilt = $this.jqGrid('getGridParam', 'postData').filters;
    var postsord = $this.jqGrid('getGridParam', 'postData').sord;
    var postsort = $this.jqGrid('getGridParam', 'postData').sidx;
    var postpage = $this.jqGrid('getGridParam', 'postData').page;

    console.log(postfilt);
    console.log(postsord);
    console.log(postsort);
    console.log(postsort);*/

    if ($this.jqGrid("getGridParam", "datatype") === "json") {
        setTimeout(function () {
            $this.jqGrid("setGridParam", {
                datatype: "local",
                postData: { filters: postfilt, sord: postsord, sidx: postsort },
                search: true
            });
            $this.trigger("reloadGrid", [{ page: postpage}]);
        }, 25);
    }
}

select2問題はドロップダウンメニューに関係していると思います。ここでは、フィルタ メニューが破棄され、再作成されていることがわかります。

var options = colModelOptions, p, needRecreateSearchingToolbar = false;
if (options != null) {
    for (p in options) {
        if (options.hasOwnProperty(p)) {
            if (options[p].edittype === "select") {
                options[p].editoptions.dataInit = initSelect2;
            }
            if (options[p].stype === "select") {
                options[p].searchoptions.dataInit = initSelect2;
            }
            $grid.jqGrid("setColProp", p, options[p]);
            if (this.ftoolbar) { // filter toolbar exist
                needRecreateSearchingToolbar = true;
            }
        }
    }
    if (needRecreateSearchingToolbar) {
        $grid.jqGrid("destroyFilterToolbar");
        $grid.jqGrid("filterToolbar", filterToolbarOptions);
    }
}

リクエストごとではなく、JqGrid の読み込みごとに 1 回だけこれを実行できる方法があれば、それは正しい方向への一歩かもしれません。

4

1 に答える 1

0

これに対する答えは非常に単純で、翌朝まで私には現れませんでした. 検索バーを作成するコードをブール チェックでラップして、1 回だけ読み込まれるようにしました。

// somewhere in the class
var gridLoaded = false;

// and in the JqGrid initialization 
loadComplete: function (response) {
    if (!gridLoaded) {
        var options = colModelOptions, p, needRecreateSearchingToolbar = false;
        if (options != null) {
            for (p in options) {
                console.log(p);
                if (options.hasOwnProperty(p)) {
                    if (options[p].edittype === "select") {
                        options[p].editoptions.dataInit = initSelect2;
                    }
                    if (options[p].stype === "select") {
                        options[p].searchoptions.dataInit = initSelect2;
                    }
                    $(this).jqGrid("setColProp", p, options[p]);
                    if (this.ftoolbar) { // filter toolbar exist
                        needRecreateSearchingToolbar = true;
                    }
                }
            }
            if (needRecreateSearchingToolbar) {
                $(this).jqGrid("destroyFilterToolbar");
                $(this).jqGrid("filterToolbar", filterToolbarOptions);
            }
        }
        gridLoaded = true;
    }
} 

助けてくれたオレグ博士に再び感謝します。

于 2013-10-29T08:43:53.133 に答える