2012-10-19 1 views
0

대용량 데이터를 표시하는 jqgrid가 있습니다. 데이터는 jquery ajax 호출 (jqgrid 로직 외부)을 통해 주기적으로 서버에서 검색됩니다. 검색된 데이터는 이전에 재 시도 된 데이터와 비교되며 js의 var로 저장되며 jqgrid의 데이터로 사용됩니다. 서로 다르면 로컬 데이터가 새로 고쳐지고 jqgrid가 다시로드됩니다. jqgrid 데이터 유형은 jsonstring입니다.로컬 데이터 세트의 jqgrid triggerToolbar 대신

이 솔루션은 사용자가 필터 도구 모음에 필터 값을 가지고있는 경우를 제외하고는 아주 잘 작동합니다. 난 loadcomplete 이벤트 필터를 트리거 0.1 초 타이머를 설정하기 때문에 필터 문자열이 존재하는 경우, 전체의 계통이 리프레시는 다음과 같다 : 사용자가 필터링 때문에

  • 20 레코드 (원래있는 jqGrid 표시했다 분리 된 ajax 호출로 서버에서 폴링 된 데이터가 브라우저에 저장된 것과 다르므로
  • jqgrid가 새로 고쳐집니다.
  • jqgrid는 매우 짧은 모든 새로운 데이터를 표시합니다 일정 기간
  • jqgrid 필터가 loadcomplete 내에서 트리거됩니다. 화면에 20 개의 레코드가 다시 표시됩니다.

기술적으로 아직 작동 중입니다. 그리드가 시각화되기 전에 jsonstring에 로컬로 필터를 다시 적용 할 수있는 방법이 있습니까? 다른 방법을 사용하면 jqgrid를 한 번만 시각화 할 수 있습니다. 그러면 새로운 jsonsting을로드하고 동시에 필터 상자에 배치 된 필터를 적용하게됩니다.

감사 casbby

업데이트 : 그리드를 다시로드하는 동안 필터를 적용 할 올렉의 솔루션 중 하나를 시도

. 이것은 demo입니다. 데이터 유형이 로컬 인 한 완벽하게 작동했습니다. 내 페이지 실제로 눈금을 다시로드 할 jsonstring 데이터 형식을 사용합니다. 코드에서이 함수는 jsonstring에 적용되는 것 같습니다. 외부 jquery 아약스가 서버에서 데이터를 성공적으로 검색 한 후 이러한 함수를 호출하기를 바랬다.

function filter() { 
      var searchFiler = $("#filter").val(), 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}]); 
     } 

누군가 나를 도울 수 있습니까? 많은 감사.

답변

2

datatype: "local"과 비교했을 때 datatype: "jsonstring"의 사용법에는 약간의 차이가 있습니다. 코드 here의 해당 부분을 비교할 수 있습니다. datatype: "local" 코드의 차이 중 하나는 addLocalDatapopulateVisible 함수의 사용법입니다. 마지막 기능 (populateVisible)은 가상 스크롤 (scroll: 1 또는 scroll: true)의 경우에만 사용됩니다. 귀하의 경우 datatype: "jsonstring"datatype: "local" 사이의 중요한 차이는 datatype: "local"의 경우 addLocalData입니다.

기능 addLocalData은 로컬 데이터의 그룹화 및 필터링을 적용합니다 (here 참조). 또한 표시된 행 목록을 현재 페이지로 자릅니다 (here 참조).

서버가 필터링되지 않은 데이터를 반환하고 필터링 된 데이터를 표시해야하는 경우 datatype: "jsonstring" 대신 datatype: "local"을 사용해야합니다. datastr 대신 data을 사용해야합니다.jsonReader (the documentation 참조) 대신 localReader을 사용해야하거나 서버에서 반환 된 데이터를 기본적으로 localReader으로 읽을 수있는 형식으로 수동으로 변환해야 할 수 있습니다.

UPDATE : 나는 설명과 localReader 사용하는 방법을 보여줍니다 데모를 포함 another answer에서.

서버에서 반환 된 입력 데이터를 표준 형식으로 변환하거나 형식의 서버에서 데이터를 반환 할 수 있습니다. data 매개 변수는 colMode의 열 이름과 같은 속성을 갖는 명명 된 개체의 배열이어야합니다. 그래서 당신이 할 수있는 일은 rows 배열을 통한 간단한 루프와 jqGrid가 요구하는 포맷으로 또 다른 배열을 만드는 것입니다. 해당 코드는 다음에 대해 수 :

// let us you have myImput with myImput.rows 
// and you have cm which you use as the value of colModel parameter 
var mydata = [], input = myImput.rows, l = input.length, 
    cmLength = cm.length, i, j, inputItem, item; 
for (i = 0; i < l; i++) { 
    inputItem = input[i]; 
    item = {id: inputItem.id}; 
    inputItem = inputItem.cell; 
    for (j = 0; j < cmLength; j++) { 
     item[cm[j].name] = inputItem[j]; 
    } 
    mydata.push(item); 
} 

같은 변환 후에는 data 매개 변수의 값으로 mydata 배열을 사용할 수 있습니다.

+0

자세한 설명을 읽어 주셔서 감사합니다. 나는 인정해야한다. Tony는 jqgrid를 만드는 훌륭한 일을 해왔지만 jqgrid에 대한 자세한 정보는 게시물을 읽었습니다. – casbby

+0

나는 서버에서 폴링 된 데이터를 처리하기 위해 데이터 유형 local을 사용하려고 시도했지만 그리드는 항상 공백으로 렌더링됩니다. 문서의 기본 로컬 판독기가 어떻게 작동하는지 생각할 수 없습니다. 모든 dataype 로컬 예제에서 필자는 열 필드 값의 배열을 포함하는 배열 만 볼 수 있습니다. 기본 localReader에는 {root : "rows", page : "page", total : "total", records : "records", repeatitems : false, cell : "cell", id : "id"} 형식이 필요합니다. 리피터 타임을 제외하고는 jsonreader와 같습니다. 내가 놓친 게 있니? – casbby

+0

@casbby : 서버가 반환하는 데이터 예제를 게시하는 것이 쉽지 않은가요? jqGrid를 정의하는 코드를 포함하면 다른 열린 질문을 지울 수 있습니다. 만약 당신이'datatype : "jsonstring", datastr : mydata' 대신에'datatype : "local", data : mydata, localReader : {repeatitems : false}'시도 할 수 있다고 생각한다면 – Oleg

관련 문제