2011-02-11 9 views
5

Znalazłem wiele dyskusji, które były bliskie temu, czego potrzebuję, a to jest najbliżej - How can I set postData._search to true in the request in jqGrid?.Jak mogę zachować filtry wyszukiwania w jqGrid podczas przeładowywania strony?

Ponieważ zmagam się z prawie tym samym problemem i po prostu nie mogę go uruchomić - chcę skonfigurować "wyszukiwanie" i "filtry" podczas początkowego ładowania jqGrid - np. Po przeładowaniu strony, i mam swoje filtry przechowywane w sesji - i próbowałem wszystkiego, co znalazłem w przykładach Olega - to po prostu nie działa!

To właśnie staram się robić -

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

Konsola wydruk pokazuje, że filtry są na miejscu, ale _search nadal jest fałszywa, a rzeczywista post zostanie wysłana nawet bez filtrów:

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

Jednakże, jeśli mogę umieścić dokładnie ten sam kod - z dodatkiem

grid.trigger("reloadGrid"); 

line - do funkcji onClickButton jakiegoś przycisku, a później kliknij przycisk - wszystko działa; ale muszę sprawić, by działał na "przeładowaniu strony"!

Wszelkie pomysły? To doprowadza mnie do szału ...

Odpowiedz

8

Wydaje mi się, że nie jesteś pierwszą osobą, która zadaje to samo pytanie. Ostatnio poprosiłem o the close question (przeczytaj wiele komentarzy do odpowiedzi). Kolejne old answer, w tym the demo, może prawdopodobnie odpowiedzieć na niektóre z otwartych pytań.

Twój kod za pomocą beforeRequest nie działają tylko dlatego, że funkcja beforeRequest będą caled bezpośrednio przed wywołania AJAX oraz zmiana parametru search jest zbyt późno. Co więcej, prawdopodobnie nie jest najlepszym pomysłem przebudzenie z filters. W przypadku, gdy użytkownik nie będzie mógł ustawić żadnego innego filtra siatki.

Mogę powtórzyć, że rozwiązanie, którego potrzebujesz, jest bardzo proste. Powinieneś ustawić właściwość filters parametrujqGrid na filtr, który potrzebujesz i dodatkowo ustawić inny parametr jqGrid search:true. To wszystko! Później użytkownik będzie mógł otworzyć okno wyszukiwania z wyprzedzeniem i zastąpić filtry. Użytkownik może również kliknąć przycisk "Resetuj" w oknie wyszukiwania zaawansowanego i ustawić filters na pusty ciąg znaków i search:false.

Dla lepszego zrozumienia muszę wyjaśnić, w jaki sposób parametr search lub inny jqGrid będzie używany w adresie URL. Istnieje parametr prmNames jqGrid, który definiuje nazwy parametrów wysyłane jako część adresu URL lub jako część danych POSTedowanych na serwer. Domyślna wartość prmNames zawierać search:"_search" a kod wewnętrznego populate funkcji używanych przez jqGrid ma następujący kod uproszczony fragment:

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

gdzie

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

Tak, aby ustawić _search parametr URL należy ustawić search parametr jqGrid.

Spójrz na the following demo. Można łatwo sprawdzić za pomocą Fiddler z Firebug że jqGrid ze strony wysyłania HTTP GET z następującym adresem 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 

Więc to zrobić dokładnie to, czego potrzebują. Kod demo zawiera następujący fragment kodu:

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

Great !! bardzo ostatnio snipped kodu całkowicie rozwiązany nędzę - To - 'jQuery ('#' + block_id) .jqGrid ({ url: loadUrl, mtype: 'POST', postData: {block_id: block_id, filtry: "{" groupOp ":" AND "," rules ": [{" field ":" Cloud Upload ", " op ":" cn "," data ":" costa "}]} '}, szukaj: prawda, autowidth: true, wysokość: '100%', typ danych: "json", // .. }); ' –

+0

[zabrakło czasu na edycję poprzedni komentarz] - gdy kładę moje wyszukiwanie/filter params do argumentów grid-init, całkowicie sprawiło, że wszystko działało. Dziękuję, naprawdę doceniam twoją pomoc! –

+1

@Oleg Ivanov: Nie ma za co! – Oleg

0

@ Odpowiedź Oleg brzmi jak czar, ale po raz pierwszy.

Po ponownym wczytaniu siatki filtry i flaga wyszukiwania nie są skonfigurowane. Za pomocą następującego kodu za każdym razem, gdy ponownie załaduję siatkę, wysyłane są również filtry i flaga wyszukiwania. Używam sortowania po stronie serwera i stronicowania.

Używam:

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

Z definicji siatki:

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

AS Oleg zwrócił uwagę, że jeśli zastąpisz prNames swoimi niestandardowymi wartościami, musisz odpowiednio zmodyfikować powyższy kod. –

Powiązane problemy