2011-02-11 1 views
5

私は何が必要なものに近いか、多くの議論を見つけました。この質問は に最も近い - How can I set postData._search to true in the request in jqGrid?です。ページリロード時にjqGridで検索フィルターを保持するにはどうすればよいですか?

私はほとんど同じ問題を抱えていて、うまく動作しません。jqGridの初期ロード時に "検索"と "フィルタ"を設定したいとします。私のフィルタはセッションに保存されています.Olegの例で見つけたものすべてを試しました。うまくいきません!私がやろうとしているものだ

-

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はまだ偽であり、実際のポストがなくてもフィルタが送信されます:

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

しかし、私は正確に同じコードを置けば - を追加して

grid.trigger("reloadGrid"); 

ライン - いくつかのボタンのonClickButton関数に入り、後でボタンをクリックする - すべてが機能する。私はそれを "ページリロード"で動作させる必要があります!

アイデア?それは私を夢中にしています...

答えて

8

私は同じ質問をする最初の人ではないようです。最近私はthe close questionで尋ねました(答えに多くのコメントを読んでください)。他のold answerthe demoなど)は、開いている質問にはおそらく答えることができます。 AJAX呼び出しとsearchパラメータの変更が手遅れになる前に機能beforeRequestがすぐcaledされるという理由だけでbeforeRequestを使用して

あなたのコードは動作しません。さらに、毎回filtersのオーバーウィードは、おそらく最良のアイデアではないでしょう。この場合、ユーザは他のグリッドフィルタを設定することができません。

私はあなたが必要とするソリューションの実装が非常に簡単であることを繰り返すことができます。必要なフィルタにpostDataのjqGridパラメータのfiltersプロパティを設定し、別のjqGridパラメータをsearch:trueに追加設定するだけです。それはすべてです!その後、ユーザーは事前検索ダイアログを開いてフィルタを上書きすることができます。ユーザは、事前検索ダイアログの「リセット」ボタンをクリックして、filtersを空の文字列に設定し、search:falseと設定することもできます。

searchパラメータまたはその他のjqGridがURLでどのように使用されるかを理解するためには、わかりやすくする必要があります。 jaGridのパラメータprmNamesには、を指定します。の名前は、URLの一部として、またはサーバーに送信されるデータの一部として送信されます。 prmNamesのデフォルト値はsearch:"_search"が含まれているとjqGridで使用される内部populate関数のコードは、以下の単純化されたコードの断片があります

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

だから1はsearchを設定する必要がありますURLの_searchパラメータを設定する

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

jqGridのパラメータ。

the following demoをご覧ください。あなたは、ページからjqGridは、次のURLにHTTP GETを送信することをFirebugFiddlerを使用して検証しやすいことができます:

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, 
    // ... 
}); 
+0

グレート!コードの非常に最後のスニップは全く不幸を解決 - この - 'jQueryの( '#' + BLOCK_ID).jqGrid({ URL:loadUrl、 MTYPE: 'POST'、 POSTDATA:{BLOCK_ID:BLOCK_ID、 フィルタ: '' "" groupOp ":" AND "、" rules ":[{"フィールド ":"クラウドアップロード "、 " op ":" cn "、" data ":" costa "}]} '}、 検索:真、 autowidth:真、 高さ: '100%'、 データ型: "JSON"、 // ... }); - 私は私の検索を入れたときに ' –

+0

は、[以前のコメントを編集するには時間を使い果たし]/filter paramsをgrid-init引数に追加すると、すべてがうまく動作します。ありがとう、本当にありがとう! –

+1

@Oleg Ivanov:ようこそ! – Oleg

0

@Olegオレグの答えは魅力的ですが、初めてです。

グリッドをリロードすると、フィルタと検索フラグが設定されません。 グリッドをリロードするたびに、次のコードを使用して、フィルタと検索フラグも送信します。 私はサーバー側の並べ替えと改ページを使用します。

私が使用しています:グリッドの定義で

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

Olegは、prNamesをカスタム値で上書きする場合、上記のコードを適切に変更する必要があると指摘しました。 –

関連する問題