2011-02-11 59 views
5

我发现很多与我需要的讨论很接近,而这个问题最接近 - How can I set postData._search to true in the request in jqGrid?如何在页面重新加载时保留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还是假的,实际的帖子被甚至没有任何过滤器发送:

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

但是,如果我把完全相同的代码 - 通过添加

grid.trigger("reloadGrid"); 

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

任何想法?这让我发疯......

回答

8

在我看来,你不是第一个问同样问题的人。最近我询问了the close question(读了很多评论的答案)。另一个old answer包括the demo可能会回答你的一些问题。

使用beforeRequest不工作,只是因为功能beforeRequest将Ajax调用和search参数的变化之前立即caled你的代码是太晚。此外,每次都可能不是最好的想法。在用户不能设置任何其他电网滤波器的情况下。

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

为了更好地理解,我必须清楚如何在URL中使用search参数或其他jqGrid。 jqGrid的参数prmNames定义了参数名称作为URL的一部分发送或作为发送到服务器的数据的一部分。的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"} 

所以设置_search参数URL中的一个应该设置search jqGrid的参数。

看看the following demo。你可以很容易检验使用的Firebug从页面的jqGrid发送HTTP GET与以下网址Fiddler

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, 
    // ... 
}); 
+0

伟大的!代码的最后一个文档片断完全解决了痛苦 - 这 - '的jQuery( '#' + BLOCK_ID).jqGrid({ 网址:使用loadURL, MTYPE: 'POST', POSTDATA:{BLOCK_ID:BLOCK_ID, 过滤器: '{“groupOp”:“AND”,“rules”:[{“field”:“Cloud Upload”, “op”:“cn”,“data”:“costa”}]'', search:真的, autowidth:真实, 高度: '100%', 数据类型: “JSON”, // .. });' –

+0

[上编辑之前的评论已经没有时间了 - 当我把我的搜索/将params过滤到grid-init参数中,它完全可以实现这一切。谢谢,我非常感谢你的帮助! –

+1

@ Oleg Ivanov:不客气! – Oleg

0

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

AS Oleg指出,如果用自定义值覆盖prNames,则必须相应地修改上面的代码。 –

相关问题