如何在页面重新加载时保留jqGrid中的搜索过滤器?

Ole*_*nov 5 javascript jquery jqgrid

我找到了许多接近我需要的讨论,这个问题是最接近的 - 如何在jqGrid的请求中将postData._search设置为true?.

因为我正在努力解决几乎相同的问题,并且无法让它工作 - 我想在jqGrid的初始加载期间设置"搜索"和"过滤器" - 比如,在页面重新加载时,我有我的存储在会话中的过滤器 - 我尝试了我在Oleg的例子中找到的所有东西 - 它只是不起作用!

这就是我想要做的 -

loadBeforeSend: function (xhr) {
    var grid = jQuery('#' + block_id);
    var postData = grid.jqGrid('getGridParam','postData');
    jQuery.extend(postData,{filters:MyFilters});
    grid.jqGrid('setGridParam', {search: true, postData: postData});
    console.log(grid.jqGrid('getGridParam','postData'));
}
Run Code Online (Sandbox Code Playgroud)

控制台打印输出显示过滤器已就位,但_search仍为false,即使没有过滤器,实际的Post也会被发送:

_search   false
block_id  report_block_1table
nd        1297451574526
page      1
rows      25
sidx      id
sord      desc
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用完全相同的代码 - 添加

grid.trigger("reloadGrid");
Run Code Online (Sandbox Code Playgroud)

line - 进入某个按钮的onClickButton函数,然后点击按钮 - 一切正常; 但我需要让它在"页面重新加载"上工作!

有任何想法吗?这让我疯狂...

Ole*_*leg 8

在我看来,你不是第一个提出同样问题的人.最近我问了一个接近的问题(读了很多评论的答案).包括演示在内另一个老答案可能会回答你打开的一些问题.

你的代码使用beforeRequest不起作用只是因为函数beforeRequest将在ajax调用之前立即被调用并且search参数的更改为时已晚.此外,filters每次都有可能不是最好的主意.在这种情况下,用户将无法设置任何其他网格过滤器.

所以我可以重复一遍,你需要的解决方案的实现非常简单.您应该只将jqGrid参数的filters属性设置为postData您需要的过滤器,并另外设置另一个jqGrid参数search:true.这就是全部!稍后,用户将能够打开高级搜索对话框并覆盖过滤器.用户还可以单击高级搜索对话框的"重置"按钮并设置filters为空字符串和search:false.

为了更好地理解,我必须清楚如何search在URL中使用参数或其他一些jqGrid.jqGrid有参数prmNames,它定义作为URL的一部分发送的参数的名称或作为POST到服务器的数据的一部分.prmNames的默认值包含,jqGrid使用search:"_search"的内部填充函数的代码具有以下简化代码片段:

var prm = {}, pN=ts.p.prmNames;
if(pN.search !== null) {prm[pN.search] = ts.p.search;}
if(pN.nd !== null) {prm[pN.nd] = new Date().getTime();}
if(pN.rows !== null) {prm[pN.rows]= ts.p.rowNum;}
if(pN.page !== null) {prm[pN.page]= ts.p.page;}
if(pN.sort !== null) {prm[pN.sort]= ts.p.sortname;}
if(pN.order !== null) {prm[pN.order]= ts.p.sortorder;}
...
$.extend(ts.p.postData,prm);
Run Code Online (Sandbox Code Playgroud)

哪里

prmNames: {page:"page",rows:"rows", sort: "sidx",order: "sord", search:"_search",
           nd:"nd", id:"id",oper:"oper",editoper:"edit",addoper:"add",
           deloper:"del", subgridid:"id", npage: null, totalrows:"totalrows"}
Run Code Online (Sandbox Code Playgroud)

所以要设置_searchURL的参数,应该设置searchjqGrid的参数.

请看下面的演示.您可以使用Fiddler of Firebug轻松验证页面中的jqGrid 是否使用以下URL发送HTTP GET:

http://www.ok-soft-gmbh.com/jqGrid/MultisearchFilterAtStart1.json?filters=%7B%22groupOp%22%3A%22AND%22%2C%22rules%22%3A%5B%7B%22field%22%3A%22invdate%22%2C%22op%22%3A%22gt%22%2C%22data%22%3A%222007-09-06%22%7D%2C%7B%22field%22%3A%22invdate%22%2C%22op%22%3A%22lt%22%2C%22data%22%3A%222007-10-04%22%7D%2C%7B%22field%22%3A%22name%22%2C%22op%22%3A%22bw%22%2C%22data%22%3A%22test%22%7D%5D%7D&_search=true&nd=1297508504770&rows=10&page=1&sidx=id&sord=asc
Run Code Online (Sandbox Code Playgroud)

所以它完全符合你的需要.演示代码包含以下代码片段:

$("#list").jqGrid({
    url: 'MultisearchFilterAtStart1.json',
    datatype: "json",
    postData: {
        filters:'{"groupOp":"AND","rules":['+
                '{"field":"invdate","op":"gt","data":"2007-09-06"}'+
                ',{"field":"invdate","op":"lt","data":"2007-10-04"}'+
                ',{"field":"name","op":"bw","data":"test"}]}'
    },
    search:true,
    // ...
});
Run Code Online (Sandbox Code Playgroud)