这个问题很多,所以请原谅我再问一次。
我有一个从网址加载的网格。
我使用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);
}
}
答案 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.filters
和postData
以及使用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: true
和postData
重新加载网格,filters
指定应用所需的过滤器。请参阅the answer或another one中执行其他操作的代码,但您需要的代码非常接近。