【问题标题】:How can I preserve the search filters in jqGrid on page reload?如何在页面重新加载时保留 jqGrid 中的搜索过滤器?
【发布时间】:2011-06-25 19:02:29
【问题描述】:

我发现许多讨论与我需要的很接近,而这个问题是 最接近的 - How can I set postData._search to true in the request in jqGrid?

因为我正在努力解决几乎相同的问题,但无法让它工作 - 我想在 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'));
}

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

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

但是,如果我输入完全相同的代码 - 加上

grid.trigger("reloadGrid");

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

有什么想法吗?快把我逼疯了……

【问题讨论】:

    标签: javascript jquery jqgrid


    【解决方案1】:

    @Oleg Oleg 的回答很有魅力,但只是第一次。

    对我来说,当我重新加载网格时,没有设置过滤器和搜索标志。 每次我重新加载网格时,它都会使用以下代码发送过滤器和搜索标志。 我使用服务器端排序和分页。

    我正在使用:

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

    关于网格定义:

    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,''];
    }
    

    【讨论】:

    • AS Oleg 指出,如果您使用自定义值覆盖 prNames,则必须相应地修改上面的代码。
    【解决方案2】:

    在我看来,您不是第一个提出同样问题的人。最近我在the close question 上提问(阅读许多cmets 来回答)。另一个old answer 包括the demo 可能会回答您的一些未解决的问题。

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

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

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

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

    在哪里

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

    所以要设置URL的_search参数,应该设置jqGrid的search参数。

    看看the following demo。您可以使用 FiddlerFirebug 轻松验证页面中的 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
    

    所以它完全满足您的需求。演示代码包含以下代码片段:

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

    【讨论】:

    • 太棒了!!最后一段代码完全解决了这个问题 - 这个 - `jQuery('#' + block_id).jqGrid({ url:loadUrl, mtype:'POST', postData:{block_id:block_id, filters:'{"groupOp" :"AND","rules":[{"field":"云上传", "op":"cn","data":"costa"}]}'}, search:true, autowidth:true, height : '100%', 数据类型: "json", // .. });`
    • [编辑上一条评论时没时间] - 当我将搜索/过滤器参数放入 grid-init 参数时,它完全可以正常工作。谢谢你,非常感谢你的帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多