简体   繁体   English

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

[英]How can I preserve the search filters in jqGrid on page reload?

I found many discussions that were close to what I need, and this question is the closest - How can I set postData._search to true in the request in jqGrid? 我找到了许多接近我需要的讨论,这个问题是最接近的 - 如何在jqGrid的请求中将postData._search设置为true? .

As I'm struggling with almost the same problem, and just can't get it working - I want to setup "search" and "filters" during the initial loading of the jqGrid - say, on the page reload, and I have my filters stored in the session - and I tried everything I found in Oleg's examples - it just doesn't work! 因为我正在努力解决几乎相同的问题,并且无法使其正常工作 - 我想在jqGrid的初始加载期间设置“搜索”和“过滤器” - 比如,在页面重新加载时,我有我的存储在会话中的过滤器 - 我尝试了我在Oleg的例子中找到的所有东西 - 它只是不起作用!

That's what I'm trying to do - 这就是我想要做的 -

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

The console printout shows that the filters are in place, but the _search is still false, and the actual Post gets sent even with no filters: 控制台打印输出显示过滤器已就位,但_search仍为false,即使没有过滤器,实际的Post也会被发送:

_search   false
block_id  report_block_1table
nd        1297451574526
page      1
rows      25
sidx      id
sord      desc

However, if I put exactly the same code - with the addition of 但是,如果我使用完全相同的代码 - 添加

grid.trigger("reloadGrid");

line - into some button's onClickButton function, and later click the button - everything works; line - 进入某个按钮的onClickButton函数,然后点击按钮 - 一切正常; but I need to make it work on "page reload"! 但我需要让它在“页面重新加载”上工作!

Any ideas? 有任何想法吗? It's driving me crazy... 这让我疯狂...

It seems to me that you are not the first person who ask the same question. 在我看来,你不是第一个提出同样问题的人。 Recently I asked on the close question (read many comments to the answer). 最近我问了一个接近的问题 (读了很多评论的答案)。 Another old answer including the demo could probably answer on some your opened questions. 包括演示在内另一个老答案可能会回答你打开的一些问题。

Your code using beforeRequest don't work just because the function beforeRequest will be caled immediately before the ajax call and the changing of the search parameter is too late . 使用beforeRequest代码不起作用只是因为函数beforeRequest将在ajax调用之前立即出现,并且更改search参数为时已晚 Moreover overwiting of filters everytime is probably not the best idea. 此外,每次filters可能不是最好的主意。 In the case the user will not able to set any other grid filter. 在这种情况下,用户将无法设置任何其他网格过滤器。

So I can repeat, that the imlementation of the solution which you need is very simple. 所以我可以重复一遍,你需要的解决方案的实现非常简单。 You should just set filters property of the postData parameter of jqGrid to the filter which you need and set another jqGrid parameter search:true additionally. 您应该将postData参数的filters属性设置为您需要的过滤器,并另外设置另一个jqGrid参数search:true It's all! 这就是全部! Later the user will be able to open advance searching dialog and overwrite the filters. 稍后,用户将能够打开高级搜索对话框并覆盖过滤器。 The user can also click on "Reset" button of the advance searching dialog and set filters to empty string and search:false . 用户还可以单击高级搜索对话框的“重置”按钮,并将filters设置为空字符串并search:false

For better understanding I have to clear how search parameter or some other jqGrid will be used in the URL. 为了更好地理解,我必须清楚如何在URL中使用search参数或其他一些jqGrid。 There are parameter prmNames of jqGrid which defines the names of parameters send as a part of URL or as a part of data POSTed to the server. jqGrid有参数prmNames ,它定义作为URL的一部分发送的参数的名称或作为POST到服务器的数据的一部分。 The default value of prmNames contain search:"_search" and the code of internal populate function used by jqGrid has the following simplified code fragment: prmNames的默认值包含search:"_search" ,jqGrid使用的内部填充函数代码具有以下简化代码片段:

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

where 哪里

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"}

So to set _search parameter of URL one should set search parameter of jqGrid. 因此要设置URL的_search参数,应该设置jqGrid的search参数。

Look at the following demo . 请看下面的演示 You can easy to verify using Fiddler of Firebug that the jqGrid from the page send HTTP GET with the following url: 您可以使用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

So it do exactly what you need. 所以它完全符合你的需要。 The code of the demo contain the following code fragment: 演示代码包含以下代码片段:

$("#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,
    // ...
});

@Oleg Oleg's answer works like a charm but just for the first time. @Oleg Oleg的答案就像魅力一样,但这是第一次。

For me when I reload the grid, filters and search flag are not set up. 对我来说,当我重新加载网格时,没有设置过滤器和搜索标志。 With the following code each time I reload the grid it also sends the filters and search flag. 每次重新加载网格时都会使用以下代码,它还会发送过滤器和搜索标志。 I use server side sort and pagination. 我使用服务器端排序和分页。

I'm using: 我正在使用:

jQuery("#myGrid").navGrid("#myPager", {search: true, refresh: true, edit: false, 
    add:false, del:false}, {}, {}, {}, {});

On the grid definition: 在网格定义上:

beforeRequest: function() {
    // filter to be added on each request
    var filterObj1 = {"field":"myField","op":"eq","data":"myValue"}; 
    var grid = jQuery("#myGrid");
    var postdata = grid.jqGrid('getGridParam', 'postData');             
    if(postdata != undefined && postdata.filters != undefined ) {
        postdata.filters = jQuery.jgrid.parse(postdata.filters);
        //Remove if current field exists
        postdata.filters.rules = jQuery.grep(postdata.filters.rules, function(value) {
            if(value.field != 'myField')
                return value;
        });
        // Add new filters
        postdata.filters.rules.push(filterObj1);
    } else {
        jQuery.extend(postdata, {
            filters:  { 
                "groupOp":"AND",
                "rules":[filterObj1] 
            }
        });
        // more filters in the way: postdata.filters.rules.push(filterObj1);
    }
    postdata.filters = JSON.stringify(postdata.filters);
    postdata._search = true;
    return [true,''];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM