Как я могу сохранить поисковые фильтры в jqGrid при перезагрузке страницы?
Я нашел много обсуждений, которые были близки к тому, что мне нужно, и этот вопрос самый близкий - Как я могу установить для postData._search значение true в запросе в jqGrid?,
Поскольку я борюсь с почти той же проблемой, и просто не могу заставить ее работать - я хочу настроить "поиск" и "фильтры" во время начальной загрузки jqGrid - скажем, на перезагрузке страницы, и у меня есть мой фильтры, сохраненные в сеансе - и я попробовал все, что нашел в примерах Олега - это просто не работает!
Вот что я пытаюсь сделать -
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");
линия - в функцию onClickButton какой-то кнопки, а затем нажмите кнопку - все работает; но мне нужно, чтобы он работал на "перезагрузке страницы"!
Есть идеи? Это сводит меня с ума...
2 ответа
Мне кажется, что вы не первый человек, который задает тот же вопрос. Недавно я задал на закрытый вопрос (читай много комментариев к ответу). Другой старый ответ, включая демо-версию, может ответить на некоторые ваши открытые вопросы.
Ваш код использует beforeRequest
не работает только потому, что функция beforeRequest
будет вызван непосредственно перед вызовом AJAX и изменением search
Параметр слишком поздний. Кроме того, filters
каждый раз, вероятно, не лучшая идея. В случае, если пользователь не сможет установить любой другой фильтр сетки.
Поэтому я могу повторить, что реализация решения, в котором вы нуждаетесь, очень проста. Вы должны просто установить filters
собственность postData
параметр jqGrid для фильтра, который вам нужен, и установите другой параметр jqGrid search:true
дополнительно. Это все! Позже пользователь сможет открыть диалоговое окно предварительного поиска и перезаписать фильтры. Пользователь также может нажать кнопку "Сброс" в диалоговом окне расширенного поиска и установить filters
очистить строку и search:false
,
Для лучшего понимания я должен уточнить, как search
Параметр или какой-либо другой jqGrid будет использоваться в URL. В 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"}
Так установить _search
параметр URL, который нужно установить search
параметр jqGrid.
Посмотрите на следующую демонстрацию. Используя Fiddler of Firebug, вы можете легко проверить, что 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,
// ...
});
@ Олег Ответ Олега работает как шарм, но только в первый раз.
Для меня, когда я перезагружаю сетку, фильтры и флаг поиска не установлены. С помощью следующего кода каждый раз, когда я перезагружаю сетку, он также отправляет фильтры и флаг поиска. Я использую серверную сортировку и нумерацию страниц.
Я использую:
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,''];
}