2011-02-11 16 views
5

Encontré muchas discusiones que estaban cerca de lo que necesito, y esta pregunta es el más cercano - How can I set postData._search to true in the request in jqGrid?.¿Cómo puedo conservar los filtros de búsqueda en jqGrid en la página de recarga?

Como estoy luchando con casi el mismo problema, y ​​simplemente no puedo ponerlo en funcionamiento - quiero configurar "búsqueda" y "filtros" durante la carga inicial de la jqGrid - por ejemplo, en la página de recarga, y tengo mis filtros almacenados en la sesión, e intenté todo lo que encontré en los ejemplos de Oleg, ¡simplemente no funciona!

Eso es lo que estoy tratando de hacer -

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')); 
} 

La consola impresión muestra que los filtros están en su lugar, pero el _search sigue siendo falsa, y el actual mensaje es enviado, incluso sin filtros:

_search false 
block_id report_block_1table 
nd  1297451574526 
page  1 
rows  25 
sidx  id 
sord  desc 

Sin embargo, si pongo exactamente el mismo código - con la adición de

grid.trigger("reloadGrid"); 

línea - en la función OnBickButton de algunos botones, y luego haga clic en el botón - todo funciona; pero necesito hacerlo funcionar en "recargar página"!

¿Alguna idea? Me está volviendo loco ...

Respuesta

8

Me parece que no eres la primera persona que hace la misma pregunta. Recientemente pregunté en the close question (lea muchos comentarios a la respuesta). Otro old answer que incluye the demo probablemente podría responder algunas de sus preguntas abiertas.

el código utilizando beforeRequest no trabajan sólo porque la función beforeRequest se caled inmediatamente antes de la llamada AJAX y el cambio del parámetro search es demasiado tarde . Además, el overwiting de filters cada vez probablemente no sea la mejor idea. En el caso, el usuario no podrá configurar ningún otro filtro de cuadrícula.

Por lo tanto, puedo repetir que la implementación de la solución que necesita es muy simple. Solo debe establecer la propiedad filters del parámetro postData de jqGrid en el filtro que necesita y establecer otro parámetro jqGrid search:true adicionalmente. ¡Es todo! Más tarde, el usuario podrá abrir el cuadro de diálogo de búsqueda avanzada y sobrescribir los filtros. El usuario también puede hacer clic en el botón "Restablecer" del cuadro de diálogo de búsqueda avanzada y establecer filters en una cadena vacía y search:false.

Para una mejor comprensión, tengo que aclarar cómo se usará el parámetro search o algún otro jqGrid en la URL. Hay el parámetro prmNames de jqGrid que define los nombres de los parámetros se envían como parte de la URL o como parte de los datos enviados al servidor POST. El valor predeterminado de prmNames contienen search:"_search" y el código de populate función interno utilizado por jqGrid tiene el siguiente fragmento de código simplificado:

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); 

donde

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"} 

Así configurar _search parámetro de URL se debe establecer search parámetro de jqGrid.

Mire the following demo. Puede fácil verificar usando Fiddler de Firebug que el jqGrid de la página enviar HTTP GET con la siguiente 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 

Por lo tanto, hacen exactamente lo que necesita. El código de la demostración contiene el siguiente fragmento de código:

$("#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

Gran !! el último cortó de código resuelve totalmente la miseria - esto - 'jQuery ('#' + block_id) .jqGrid ({url : LoadURL, mtype: 'post', Postdata: {block_id: block_id, filtros: '{"groupOp": "AND", "rules": [{"field": "Cloud Upload", "op": "cn", "data": "costa"}]}}}, búsqueda: verdadera, ANCHO AUTO: true, altura: '100%', tipo de datos: "json", // .. }); ' –

+0

[acabaron de tiempo en la edición del comentario anterior] - cuando pongo mi búsqueda/filtro de params en los argumentos grid-init, lo hizo funcionar totalmente. Gracias, realmente aprecio tu ayuda! –

+1

@Oleg Ivanov: ¡De nada! – Oleg

0

@ Oleg respuesta de Oleg funciona como un encanto, pero por primera vez.

Para mí, cuando recargo la cuadrícula, los filtros y el indicador de búsqueda no están configurados. Con el siguiente código cada vez que recargo la grilla, también envía los filtros y el indicador de búsqueda. Uso el orden y la paginación del lado del servidor.

que estoy usando:

jQuery("#myGrid").navGrid("#myPager", {search: true, refresh: true, edit: false, 
    add:false, del:false}, {}, {}, {}, {}); 

En la definición de la retícula:

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,'']; 
} 
+0

Como Oleg señaló si reemplaza prNames con sus valores personalizados, debe modificar el código de arriba según corresponda. –

Cuestiones relacionadas