3

这个问题已经很多了,所以请原谅我再问一次。

我有一个从 url 加载的网格。

我使用 loadonce: true

我使用过滤器工具栏:

$("#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 。我很确定在重新加载时会保留

在网格上,过滤器工具栏保留了我的过滤条件,包括文本和选择,但是当网格重新加载时,过滤器被忽略并且整个数据集都显示在网格中。

我已经尝试过在 SO 上发布的许多示例。我尝试将 [{current:true}] 添加到 reloadGrid 调用 - 没有区别。我似乎无法在重新加载时保留和应用过滤器。

我希望重新加载始终从服务器返回完整的数据集(这很好),并允许当前的过滤器设置控制重新加载后显示的内容。我不想使用 postdata 来构建新的 SQL 选择语句 - 服务器端过滤,因为在任何时候用户可能想要单击暂停按钮,选择一个新的过滤器并从整个数据集中查看其他内容,而无需再次重新加载。

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

正如我在一篇文章中所看到的,如何在不使用 cookie 的情况下做到这一点?

我可以尝试使用 jqGridExport'ing postfilt var,然后 jqGridImport'ing 它,但希望有更直接的方法。我什至不确定这会有所帮助,因为我已经通过 postData 在网格中拥有了我需要的一切。

附带说明一下,在我上面的 setGridParam 中,我指定的 loadtext 永远不会显示。而是显示默认的“正在加载...”。所有其他参数都在工作。

非常感谢,迈克

解决方案。从服务器重新加载 [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.filterspostData使用filter属性而不是过滤器``。你用

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

获得filter财产而不是filters. 你得到了undefined价值。所以设置postDatapostfilt没有任何意义。

下一个问题是服务器响应包含未过滤的数据。要在本地强制过滤数据,您必须在从服务器加载完成后重新加载网格一次。您可以在loadComplete. 正是在这里,您可以postData.filter根据需要设置、设置search: true和触发 reloadGrid 事件。重要的是只执行一次就没有递归,并且在这种情况下您不能datatype返回"json"。在使用选项的情况下,datatype将更改为"local"并结束从服务器加载。loadonce: true如果要在本地应用过滤,则必须使用选项重新加载网格datatype: "local", search: truepostData具有filters指定需要应用的过滤器。查看答案中的代码或另一个执行其他操作的代码,但您需要的代码将非常接近。

于 2013-01-22T22:03:11.747 回答