如何保留页面重新加载jqGrid中的searchfilter?

我发现很多讨论是接近我所需要的,这个问题是最接近的 – 我怎样才能在jqGrid的请求中设置postData._search为真? 。

由于我几乎面临同样的问题挣扎,只是不能得到它的工作 – 我想设置“search”和“filter”在jqGrid的初始加载 – 比如说,在页面重新加载,我有我的filter存储在会话中 – 我尝试了一切,我发现在奥列格的例子 – 它只是不工作!

这就是我想要做的 –

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

控制台打印输出显示filter已经就位,但_search仍然是错误的,实际的发布甚至没有filter发送:

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

但是,如果我把完全相同的代码 – 加上

 grid.trigger("reloadGrid"); 

行 – 进入一些button的onClickButton函数,并稍后点击button – 一切正常; 但我需要使它在“页面重新加载”上工作!

有任何想法吗? 这让我发疯

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

使用beforeRequest代码不工作,仅仅是因为beforeRequest函数会紧接在ajax调用之前,并且search参数的改变太迟了 。 而且,每次都filtersfilters可能不是最好的主意。 在用户不能设置任何其他电网滤波器的情况下。

所以我可以重复一遍,你所需要的解决scheme的实施非常简单。 您应该将postData参数的filters属性设置为您需要的filter,并另外设置另一个jqGrid参数search:true 。 这一切! 稍后,用户将能够打开高级search对话框并覆盖filter。 用户也可以点击预先search对话框中的“重置”button,将filters设置为空string,并search:false

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

哪里

 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参数。

看看下面的演示 。 你可以很容易的使用Firebug的 Fiddler来validation页面的jqGrid发送HTTP GET的URL如下:

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

Oleg Oleg的答案就像一个魅力,但第一次。

对我来说,当我重新加载网格,filter和search标志没有build立。 每次我重新加载网格时,下面的代码也会发送filter和search标志。 我使用服务器端sorting和分页。

我在用着:

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