3

この質問はたくさんありましたので、もう一度質問することを許してください。

URLからグリッドをロードしました。

loadonceを使用します:true

filtertoolbarを使用します:

$("#status").jqGrid('filterToolbar', { stringResult:true, searchOnEnter:false, autosearch: true, defaultSearch: "cn" });

探しているものを選択できるドロップダウン検索リストがあります。よく働く。

30秒ごとにリロードを開始するためにクリックするナビゲーションボタンがあります。よく働く。

$("#status").jqGrid('navButtonAdd','#statuspager', { caption: '', buttonicon: 'ui-icon-play', onClickButton: function ()
{
stint = setInterval (function() {
      postfilt = $("#status").jqGrid('getGridParam', 'postData').filter;

      $("#status").jqGrid('setGridParam',{
             url: './ar_status.cgi?systemtype=' + systype,
             datatype: "json",
             postData: postfilt,
             search: true,
             loadtext: "Refreshing grid...",
             loadonce: true,
             loadui: "block"
      });
      $("#status").jqGrid().trigger("reloadGrid");
}, 30000);
},
title: 'Start Auto Refresh (every 30 sec.)'
});

グーグルクロームを使用して、サーバーに投稿されているように指定されたフィルターを見ることができます:

systemtype:production
_search:true
nd:1358887757603
rows:1000
page:1
sidx:system
sord:asc
totalrows:700
filters:{"groupOp":"AND","rules":[{"field":"system","op":"eq","data":"ATTDA02"}]}

リロードの間にフィルターを変更して、新しい、さらには複数のフィルターを確認できます。

systemtype:production
_search:true
nd:1358887847592
rows:1000
page:1
sidx:system
sord:asc
totalrows:700
filters:{"groupOp":"AND","rules":[{"field":"system","op":"eq","data":"ATTDA02"},{"field":"dow","op":"cn","data":"MO"}]}

私はmultipleSearchを使用しています:初期ロードでtrue。私はそれがリロード時に保持されるとかなり確信しています

グリッドでは、filtertoolbarはテキストと選択の両方のフィルター基準を保持しますが、グリッドがリロードされると、フィルターは無視され、データセット全体がグリッドに表示されます。

私はここにSOに投稿された多くの例を試しました。[{current:true}]をreloadGrid呼び出しに追加してみました-違いはありません。リロード時にフィルターを保持して適用できないようです。

リロードで常にサーバーから完全なデータセットを返し(これは正常に行われます)、現在のフィルター設定でリロード後に表示される内容を制御できるようにしたいと思います。postdataを使用して新しいSQLselectステートメント(サーバー側のフィルタリング)を作成したくありません。ユーザーはいつでも一時停止ボタンをクリックして新しいフィルターを選択し、データセット全体から別のデータセットを再読み込みせずに表示したい場合があるためです。

$("#status").jqGrid('navButtonAdd','#statuspager', { caption: '', buttonicon: 'ui-icon-pause', onClickButton: function ()
{
   clearInterval(stint);
},
title: 'End Auto Refresh'
});

ある投稿で見たように、Cookieを使用せずにこれを行うにはどうすればよいですか?

postfilt varをjqGridExportで使用してから、jqGridImportを使用してみることができましたが、より直接的なアプローチを望んでいました。postDataを介してグリッドに必要なものがすべて揃っているので、これが役立つかどうかさえわかりません。

ちなみに、上記のsetGridParamでは、指定したロードテキストが表示されません。代わりに、デフォルトの「Loading...」が表示されます。他のすべてのパラメーターは機能しています。

よろしくお願いします、マイク

解決。サーバーから[json]をリロードした後、フィルター、並べ替えインデックス、並べ替え順序を保持するための完全なloadComplete:

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

                            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");
                                    }, 50);
                            }
                    }
4

2 に答える 2

4

どうもありがとう!!!!

ページ番号も保持するために、ソリューションに少しだけ追加しました。

                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;

                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);
                }
            }
于 2013-03-22T12:22:08.467 に答える
2

よくわかりませんが、最初の問題の原因は、フィルターではなく、混合と使用プロパティである可能性がpostData.filtersありpostDataますfilter」あなたが使う

postfilt = $("#status").jqGrid('getGridParam', 'postData').filter;

filterの代わりにプロパティを取得しますfilters。あなたはundefined価値を得る。したがって、postDataへの設定postfiltは何の意味もありません。

次の問題は、サーバーの応答にフィルター処理されていないデータが含まれていることです。データをローカルで強制的にフィルタリングするには、サーバーからの読み込みが完了した後、グリッドを1回再読み込みする必要があります。これはの内部で行うことができますloadComplete。ここで、必要に応じて、 reloadGridイベントpostData.filterを設定およびトリガーできます。再帰がないようにこれを1回search: trueだけ行うことが重要であり、ケースに戻らないようにする必要があります。使用オプションの場合、はに変更され、サーバーからのロードが終了します。ローカルでフィルタリングを適用する場合は、オプションを使用してグリッドを1回リロードする必要があります。datatype"json"datatype"local"loadonce: truedatatype: "local", search: truepostDatafilters適用する必要のあるフィルターを指定します。答えからのコードまたは別のことを行う別のコードを参照してください。ただし、必要なコードは非常に近くなります。

于 2013-01-22T22:03:11.747 に答える