javascript - Hur kan jag bevara sökfilter i jqGrid vid omladdning av sidan?
Jag hittade många diskussioner som var nära det jag behöver, och denna fråga är den närmaste - Hur kan jag sätta postData._search till true i förfrågan i jqGrid?
Eftersom jag kämpar med nästan samma problem och bara inte kan få det att fungera - jag vill ställa in "sök" och "filter" under den initiala laddningen av jqGrid - säg, vid sidan om omladdning, och jag har mina filter sparade i sessionen - och jag har försökt allt jag hittade i Olegs exempel - det fungerar bara inte!
Det är det jag försöker göra -
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'));
}
Konsolutskriften visar att filtren är på plats, men _search är fortfarande falskt, och den faktiska posten skickas även utan några filter:
_search false
block_id report_block_1table
nd 1297451574526
page 1
rows 25
sidx id
sord desc
Men om jag sätter exakt samma kod - med tillägget av
grid.trigger("reloadGrid");
rad - in i någon knapp's onClickButton-funktion, och klicka senare på knappen - allt fungerar; men jag behöver få det att fungera vid "sidomladdning"!
Några idéer? Det gör mig galen...
Svar #1
Det verkar för mig som att du inte är den första personen som ställer samma fråga. Nyligen frågade jag om den stängda frågan (läs många kommentarer till svaret). Ett annat gammalt svar inklusive demon kan förmodligen besvara några av dina öppna frågor.
Din kod som använder beforeRequest fungerar inte bara för att funktionen beforeRequest kommer att kallas omedelbart innan ajax-anropet och ändringen av search-parametern är för sent. Dessutom är det förmodligen inte den bästa idén att skriva över filters varje gång. I så fall kommer användaren inte att kunna ställa in några andra rutnätsfilter.
Så jag kan upprepa, att implementeringen av lösningen som du behöver är mycket enkel. Du bör bara ställa in filters-egenskapen för postData-parametern i jqGrid till det filter du behöver och dessutom ställa in en annan jqGrid-parameter search:true. Det är allt! Senare kommer användaren att kunna öppna avancerad sökdialog och skriva över filtren. Användaren kan också klicka på knappen "Återställ" i den avancerade sökdialogen och sätta filters till en tom sträng och search:false.
För bättre förståelse måste jag klargöra hur search-parametern eller någon annan jqGrid kommer att användas i URL:en. Det finns parametrar prmNames i jqGrid som definierar namnen på parametrarna som skickas som en del av URL:en eller som en del av data som POSTas till servern. Standardvärdet för prmNames innehåller search:"_search" och koden för den interna populate-funktionen som används av jqGrid har följande förenklade kodfragment:
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);
var
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"}
Så för att ställa in _search-parametern i URL:en bör man ställa in search-parametern i jqGrid.
Titta på följande demo. Du kan enkelt verifiera med Fiddler eller Firebug att jqGrid från sidan skickar HTTP GET med följande 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
Så det gör exakt vad du behöver. Koden i demon innehåller följande kodfragment:
$("#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,
// ...
});
Svar #2
@Oleg Olegs svar fungerar som en charm men bara första gången.
För mig, när jag laddar om rutnätet, är inte filter och sökflagga inställda. Med följande kod skickas filter och sökflagga varje gång jag laddar om rutnätet. Jag använder sortering och paginering på serversidan.
Jag använder:
jQuery("#myGrid").navGrid("#myPager", {search: true, refresh: true, edit: false,
add:false, del:false}, {}, {}, {}, {});
Om rutnätsdefinitionen:
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,''];
}
