Мне кажется, что вы не первый человек, который задает тот же вопрос. Недавно я задал закрытый вопрос (прочитайте много комментариев к ответу). Другой старый ответ , включая демо , вероятно, может ответить на некоторые ваши открытые вопросы.
Ваш код, использующий beforeRequest
, не работает только потому, что функция beforeRequest
будет вызываться непосредственно перед вызовом ajax, а изменение параметра search
на слишком поздно . Более того, игнорирование filters
каждый раз, вероятно, не лучшая идея. В случае, если пользователь не сможет установить любой другой фильтр сетки.
Так что я могу повторить, что реализация необходимого вам решения очень проста. Вам нужно просто установить свойство filters
параметра postData
в jqGrid для фильтра, который вам нужен, и дополнительно установить еще один параметр jqGrid search:true
. Это все! Позже пользователь сможет открыть диалоговое окно предварительного поиска и перезаписать фильтры. Пользователь также может нажать кнопку «Сброс» в диалоговом окне расширенного поиска и установить filters
в пустую строку и search:false
.
Для лучшего понимания я должен пояснить, как параметр search
или какой-либо другой jqGrid будет использоваться в URL. В jqGrid есть параметр prmNames , который определяет имена параметров , отправляемых как часть URL или как часть данных, отправленных на сервер. Значение по умолчанию prmNames содержит search:"_search"
, а код внутренней функции populate , используемой 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 из 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,
// ...
});