jqgrid在重新加载时保留过滤器

时间:2013-01-22 20:59:38

标签: jqgrid filter reload persist

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

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

我使用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来构建新的SQL select语句 - 服务器端过滤,因为在任何时候用户可能想要单击暂停按钮,选择一个新过滤器并从整个数据集查看其他内容而无需重新加载。

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

如何在不使用cookie的情况下完成这项工作,正如我在一篇文章中看到的那样?

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

作为旁注,在上面的setGridParam中,我指定的loadtext永远不会显示。而是显示默认的“正在加载...”。所有其他参数都有效。

非常感谢, 麦克

解。完整的loadComplete,用于在从服务器重新加载[json]后保留过滤器,排序索引和排序顺序:

                    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);
                            }
                    }

2 个答案:

答案 0 :(得分: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);
                }
            }

答案 1 :(得分:2)

我不确定,但我认为您的第一个问题的根源可能是混合postData.filterspostData以及使用filter属性而不是过滤器``。你用

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

获取filter属性而不是filters。您获得undefined值。因此,将postData设置为postfilt意味着什么。

下一个问题是服务器响应包含未过滤的数据。要强制过滤数据本地,您必须在从服务器加载完成后重新加载网格一次。您可以在loadComplete内执行此操作。在这里,您可以根据需要设置postData.filter,设置search: true并触发reloadGrid事件。重要的是只执行一次以便不进行递归,并且在这种情况下,您必须不将datatype设置回"json"。如果使用datatype选项,"local"将更改为loadonce: true并从服务器加载结束。如果您想在本地应用过滤 ,则必须使用选项datatype: "local", search: truepostData重新加载网格,filters指定应用所需的过滤器。请参阅the answeranother one中执行其他操作的代码,但您需要的代码非常接近。