Как я могу сохранить поисковые фильтры в 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,''];
}
Другие вопросы по тегам