Как я могу сохранить поисковые фильтры в jqGrid при перезагрузке страницы? - PullRequest
5 голосов
/ 11 февраля 2011

Я нашел много обсуждений, которые были близки к тому, что мне нужно, и этот вопрос самый близкий - Как я могу установить значение true для postData._search в запросе в 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 ]

8 голосов
/ 12 февраля 2011

Мне кажется, что вы не первый человек, который задает тот же вопрос. Недавно я задал закрытый вопрос (прочитайте много комментариев к ответу). Другой старый ответ , включая демо , вероятно, может ответить на некоторые ваши открытые вопросы.

Ваш код, использующий 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,
    // ...
});
0 голосов
/ 03 марта 2014

@ Олег Ответ Олега работает как очарование, но только в первый раз.

Для меня, когда я перезагружаю сетку, фильтры и флаг поиска не устанавливаются.С помощью следующего кода каждый раз, когда я перезагружаю сетку, он также отправляет фильтры и флаг поиска.Я использую серверную сортировку и нумерацию страниц.

Я использую:

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,''];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...