2011-02-11 3 views
5

내가 필요한 것에 가깝게 많은 토론을 발견했습니다.이 질문은 에 가장 가까운 것입니다 - How can I set postData._search to true in the request in jqGrid?입니다.페이지를 새로 고침 할 때 jqGrid에서 검색 필터를 유지하려면 어떻게해야합니까?

거의 동일한 문제로 어려움을 겪고 있으며 제대로 작동하지 않습니다. jqGrid의 초기로드 중에 "검색"및 "필터"를 설정하고 싶습니다. 세션에 저장된 필터를 가지고 있으며 올렉의 예에서 찾은 모든 것을 시도했습니다. 작동하지 않습니다. 내가 할 노력하고있어 무엇

-

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 (많은 댓글을 읽어보십시오)에 물었다. the demo을 포함한 다른 old answer은 아마도 열려있는 질문에 대답 할 수 있습니다.

기능 beforeRequest이 AJAX 호출과 search 매개 변수의 변화 직전에 caled됩니다해서 작동하지 않습니다 beforeRequest를 사용하는 코드는 너무 늦게 입니다. 게다가 매번 filters의 overwiting은 아마도 최선의 생각이 아닙니다. 이 경우 사용자는 다른 격자 필터를 설정할 수 없습니다.

그래서 반복 할 수 있습니다. 필요한 솔루션을 구현하는 것이 매우 간단합니다. 필요한 필터에 postData 매개 변수 인 jqGrid의 filters 속성을 설정하고 또 다른 jqGrid 매개 변수 search:true을 추가로 설정해야합니다. 모두 다! 나중에 사용자는 사전 검색 대화 상자를 열고 필터를 덮어 쓸 수 있습니다. 사용자는 사전 검색 대화 상자의 "재설정"버튼을 클릭하고 filters을 빈 문자열로 설정하고 search:false을 설정할 수 있습니다.

search 매개 변수 또는 다른 jqGrid가 URL에서 어떻게 사용되는지 명확히 이해해야합니다. 매개 변수 이름으로 정의하는 jqGrid의 매개 변수 prmNames이 URL의 일부로 전송되거나 서버에 게시 된 데이터의 일부로 전송됩니다.

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

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

그래서 하나 search 설정해야 URL의 _search 파라미터를 설정하려면 prmNamessearch:"_search" 포함 기본값과있는 jqGrid 의해 사용 내부 populate 함수의 코드는 다음의 단순화 된 코드 단편을 보유 jqGrid의 매개 변수

the following demo을 살펴보십시오. 당신은 쉽게 다음 URL을 Firebug 페이지에서있는 jqGrid 전송하는 HTTP GET의 Fiddler 사용하여 확인합니다 수 있습니다

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, 필터 : '012' '' '' "" "" "" "" "" "" "" "" "" "" "" "" " 사실, autowidth : 사실, 높이 : '100 %', 데이터 형식 : "JSON", // .. });' –

+0

는 [이전 주석을 편집에 시간이 부족] - 난 내 검색을 넣을 때/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를 사용자 지정 값으로 덮어 쓰면 위의 코드를 적절하게 수정해야한다고 지적했습니다. –

관련 문제