这个问题已经问了很多,所以请原谅我再问一次。
我有一个从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.)'
});
使用google chrome,我可以看到指定的过滤器被发布到服务器上:
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 select语句-服务器端筛选,因为在任何时候,用户都可能想要单击pause按钮,选择一个新的筛选器,然后查看整个数据集中的其他内容,而无需再次重新加载。
$("#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中,我指定的加载文本从未显示过。相反,默认的“正在加载...”将显示。所有其他参数都在起作用。
先谢谢你,迈克
解决方案。从服务器重新加载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);
}
}
发布于 2013-01-22 22:03:12
我不确定,但我想你的第一个问题的根源可能是混合了postData.filters
和postData
,使用了filter
属性,而不是过滤器。您可以使用
postfilt = $("#status").jqGrid('getGridParam', 'postData').filter;
获取filter
属性而不是filters
。你得到了undefined
的值。因此,将postData
设置为postfilt
没有任何意义。
下一个问题是服务器响应包含未过滤的数据。要在本地强制过滤数据,必须在从服务器加载完成后重新加载网格。您可以在loadComplete
中完成此操作。如果需要,您可以在这里设置postData.filter
,设置search: true
并触发reloadGrid事件。重要的是,只需执行一次,这样就没有递归,并且在这种情况下,您不能将datatype
设置回"json"
。在使用loadonce: true
选项的情况下,datatype
将更改为"local"
,并结束从服务器加载。如果你想在本地应用过滤,你必须使用选项datatype: "local", search: true
和postData
重新加载网格一次,让filters
指定需要应用的过滤器。查看来自the answer或another one的代码,它们做了其他事情,但您需要的代码将非常接近。
发布于 2013-03-22 12:22:08
非常感谢!
我只是在您的解决方案中添加了一点,以同时保留页码:
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);
}
}
https://stackoverflow.com/questions/14467883
复制相似问题