2011-04-21 12 views
6

Sembra che ci siano state alcune domande in merito a questo argomento, e hanno delle ottime risposte, ma sembra che il mio caso sia un po 'diverso. Ho bisogno di filtrare i record visualizzati in un jqGrid, ma interamente lato client.jqGrid Filtering Records

Per diversi motivi, il modo migliore per popolare la mia griglia è con un array emesso direttamente nel JavaScript nella pagina. La griglia stessa non interagisce affatto con il server. Ho alcuni AJAX personalizzati che si verificano in vari eventi della griglia, ma il gioco è fatto. (Fondamentalmente, sto integrando questo con un set esistente di servizi disponibili che non possono cambiare in modo significativo.)

Quello che sto cercando di fare è filtrare la griglia sulla base di un semplice input di testo e pulsante. La mia pagina ha l'input di testo, il pulsante e una tabella (che diventa la griglia sul documento pronto). Mi piacerebbe associare all'evento click del pulsante (normale associazione evento jQuery, niente di speciale) e utilizzare il valore dall'input di testo come filtro di visualizzazione su jqGrid.

Con "filtro" intendo visualizzare solo i record che contengono una corrispondenza (in qualsiasi campo) per il testo nell'input. Quindi, per visualizzare tutti i record, è sufficiente svuotare l'input e fare nuovamente clic sul pulsante. Inoltre, la griglia è multi-selezione e le selezioni devono persistere attraverso il filtraggio. Devo solo essere in grado di nascondere le righe che non corrispondono a ciò che è nell'input.

È possibile?

risposta

20

Per filtrare la griglia locale è necessario riempire solo la proprietà filters del parametro postData di jqGrid e impostare inoltre search:true.

Per salvare la selezione della griglia è possibile utilizzare reloadGrid con il parametro aggiuntivo [{page:1,current:true}] (vedere here).

Il codice corrispondente può essere la seguente

$("#search").click(function() { 
    var searchFiler = $("#filter").val(), grid = $("#list"), f; 

    if (searchFiler.length === 0) { 
     grid[0].p.search = false; 
     $.extend(grid[0].p.postData,{filters:""}); 
    } 
    f = {groupOp:"OR",rules:[]}; 
    f.rules.push({field:"name",op:"cn",data:searchFiler}); 
    f.rules.push({field:"note",op:"cn",data:searchFiler}); 
    grid[0].p.search = true; 
    $.extend(grid[0].p.postData,{filters:JSON.stringify(f)}); 
    grid.trigger("reloadGrid",[{page:1,current:true}]); 
}); 

ho fatto the demo per voi quale filtro per due colonne 'Client' ('name') e 'Notes' ('nota') è possibile estendere il codice per cercare in tutte le colonne di cui hai bisogno.

A seconda di cosa si intende esattamente con la selezione della riga di salvataggio, è possibile salvare la selezione corrente da selarrrow in una variabile e ripristinare le righe selezionate con il metodo setSelection.

+1

Questo sembra fantastico, grazie! Un paio di cose strane stanno accadendo per me. 1: In IE 8 (l'unico browser di destinazione del progetto, gli ordini del cliente) sull'ambiente fornito dal mio client, si dice che 'JSON' non è definito. Ma non lo dice sulla tua demo nello stesso browser. 2: Nella demo che hai impostato non sta salvando la selezione delle righe tra i filtri. Le righe che sono selezionate, nascoste, quindi non nascoste non sono più selezionate. Tuttavia, durante l'implementazione di questo, ho avuto un'idea che potrebbe funzionare in modo più semplice e più nativo con jqGrid ... – David

+0

Cosa succede se, invece di filtrare la griglia principale, la funzionalità filtro apre una finestra di dialogo modale dell'interfaccia utente jQuery (facile) che ha il suo propria griglia che visualizza i record filtrati (posso facilmente popolare 'grid2' con un set di dati filtrato da' grid1'? Immagino il caso peggiore è copiare l'array e filtrare in un ciclo con JS semplice prima di impostarlo come i dati in ' grid2'). Quindi l'utente seleziona ciò che desidera e chiude la finestra di dialogo modale. Alla chiusura, ottengo gli ID selezionati da 'grid2' (facile) e li seleziono come selezionato in' grid1' (facile, demo è sul sito jqGrid). E, ovviamente, cancella 'grid2'. Pensieri? – David

+1

@David: l'errore "JSON" non è definito "perché non è incluso [json2.js] (https://github.com/douglascrockford/JSON-js). IE8 ha anche il supporto nativo della classe 'JSON' se è installato l'aggiornamento [976662] (http://support.microsoft.com/kb/976662).Ti consiglio di includere sempre json2.js per assicurarti che 'JSON.stringify' funzioni. – Oleg