【问题标题】:jqgrid retain filter on reloadjqgrid在重新加载时保留过滤器
【发布时间】:2013-01-22 20:59:38
【问题描述】:

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

我有一个从 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);
                            }
                    }

【问题讨论】:

    标签: jqgrid filter reload persist


    【解决方案1】:

    非常感谢!!!!

    我只是在您的解决方案中添加了一点以保留页码:

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

    【讨论】:

      【解决方案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 的代码,它们可以做其他事情,但您需要的代码将非常接近。

      【讨论】:

      • 感谢您的指导,奥列格。我还没有设法完成这项工作。我每次都必须从服务器刷新网格,这意味着每次数据类型都是 json。我尝试立即将数据类型设置为“本地”,但它没有粘住,或者网格刷新为空。我可以通过一系列 alert() 调用来跟踪进度,我可以看到它正在接近;该数据类型被设置为本地,但即使这样,过滤器也不会应用。我会继续破解它。
      • @Mike:不客气!我只能重复您应该遵循the answer 中的代码。您应该从具有datatype: "json"loadonce: true 的服务器加载完整 数据。然后你应该像答案一样从loadCompleted 触发reloadGrid 立即。它对加载的数据进行本地排序和过滤。稍后,当您需要通过从服务器重新加载数据来刷新数据时,您应该将datatype 更改为"json"
      • 你很有耐心,奥列格。我又检查了一遍,[故意]我在 loadComplete 上遗漏了 setTimeout 函数。这似乎没有必要,但是将其添加回来会有所不同。我现在拥有我所追求的。我不喜欢复制/粘贴/希望它有效。你能解释一下为什么需要 setTimeout 吗?
      • @Mike:差别非常大。在处理从服务器返回的数据期间,jqGrid 将调用回调函数loadComplete(参见the line)。所以服务器返回的响应的处理还没有结束。使用setTimeout 允许完成当前的响应处理,然后将处理下一个reloadGrid
      • 我认为它可能不是延迟机制,因为我可以将超时设置为零并且仍然可以获得预期的结果。无论如何,再次感谢您的帮助,以及您对 jqgrid 社区的所有贡献。非常慷慨。
      猜你喜欢
      • 2011-06-25
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      相关资源
      最近更新 更多