我发现很多讨论都接近我所需要的,而这个问题就是 最近的 - 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,即使没有过滤器也会发送实际的帖子:
_search false
block_id report_block_1table
nd 1297451574526
page 1
rows 25
sidx id
sord desc
但是,如果我添加完全相同的代码 - 添加
grid.trigger("reloadGrid");
line - 进入某个按钮的onClickButton函数,然后点击按钮 - 一切正常;但我需要让它在“页面重新加载”上工作!
有什么想法吗?这让我发疯了......
答案 0 :(得分:8)
在我看来,你不是第一个提出同样问题的人。最近我问了the close question(读了很多评论的答案)。包括old answer在内的另一个the demo可能会回答您打开的一些问题。
使用beforeRequest
的代码不起作用只是因为函数beforeRequest
会在ajax调用之前立即出现,并且search
参数的更改太晚< / strong>即可。此外,每次filters
的覆盖可能不是最好的主意。在这种情况下,用户将无法设置任何其他网格过滤器。
所以我可以重复一遍,你需要的解决方案的实现非常简单。您应该将jqGrid的filters
参数的postData
属性设置为您需要的过滤器,并另外设置另一个jqGrid参数search:true
。这就是全部!稍后,用户将能够打开高级搜索对话框并覆盖过滤器。用户还可以单击高级搜索对话框的“重置”按钮,并将filters
设置为空字符串和search:false
。
为了更好地理解,我必须清楚如何在URL中使用search
参数或其他一些jqGrid。 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。您可以使用Fiddler Firebug轻松验证页面中的jqGrid是否使用以下网址发送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,
// ...
});
答案 1 :(得分: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,''];
}