2012-01-11 3 views
1

인라인 행 편집 (행을 편집 상태에 넣고 $grid.jqGrid('editRow', rowId, ...etc)을 통해)을 사용한 다음 실제로 행을 편집하지 않고 행을 복원하는 동작을 발견했습니다 서식이 지정된 열의 원래 값이 아닌 형식이 지정된 값으로 $grid.p.data[{indexofrowrestored}][{columnname}]을 설정합니다.JQGrid 도구 모음 필터 및 서식이 지정된 열을 사용하여 편집 상태의 행을 복원하는 중

이것의 결과는 (이 모든 다른 행처럼) 복원 된 행의 툴바 필터 입력 형식이 지정된 값보다 형식화 값에 기초하여 행 필터링한다는 것이다.

는 내가있는 jqGrid의 소스를 통해 가서이 문제 (있는 jqGrid의 v4.3.1)에 대한 해결책을 마련했다.

이 (추가 코드에 대한 주석을 참조) jquery.jqGrid.src.js의 라인 9038에 응시 :

restoreRow : function(rowid, afterrestorefunc) { 
    // Compatible mode old versions 
    var args = $.makeArray(arguments).slice(1), o={}; 

    if($.jgrid.realType(args[0]) === "Object") { 
     o = args[0]; 
    } else { 
     if ($.isFunction(afterrestorefunc)) { o.afterrestorefunc = afterrestorefunc; } 
    } 
    o = $.extend(true, $.jgrid.inlineEdit, o); 

    // End compatible 

    return this.each(function(){ 
     var $t= this, fr, d, ind, ares={}; //UPDATED: added the variable 'd' 
     if (!$t.grid) { return; } 
     ind = $($t).jqGrid("getInd",rowid,true); 
     if(ind === false) {return;} 
     for(var k=0;k<$t.p.savedRow.length;k++) { 
      if($t.p.savedRow[k].id == rowid) {fr = k; break;} 
     } 
     //---------------------------------------------------------------------------- 
     //ADDED: added this for-loop 
     //  get a hold of the $t.p.data array row with the ID of the 
     //  row being restored; this row contains the original, unformatted 
     //  data that came from the server while $t.p.savedRow contains 
     //  what appears to be formatted column data; this is messing 
     //  up the toolbar filter accuracy (which filters on original, unformatted 
     //  data) when the row is restored 
     for(var k=0;k<$t.p.data.length;k++) { 
      if($t.p.data[k].id == rowid) {d = k; break;} 
     } 
     //END EDIT 
     //---------------------------------------------------------------------------- 
     if(fr >= 0) { 
      if($.isFunction($.fn.datepicker)) { 
       try { 
        $("input.hasDatepicker","#"+$.jgrid.jqID(ind.id)).datepicker('hide'); 
       } catch (e) {} 
      } 
      $.each($t.p.colModel, function(i,n){ 
       if(this.editable === true && this.name in $t.p.savedRow[fr] && !$(this).hasClass('not-editable-cell')) { 
        //EDIT: this line was edited to set ares[this.name] to 
        //the original, unformatted data rather than the saved row data 
        //so, below, when setRowData method is called, it is being set 
        //to original data rather than formatted data 
        ares[this.name] = $t.p.data[d][this.name]; 
        //END EDIT 
       } 
      }); 
      $($t).jqGrid("setRowData",rowid,ares); 
      $(ind).attr("editable","0").unbind("keydown"); 
      $t.p.savedRow.splice(fr,1); 
      if($("#"+$.jgrid.jqID(rowid), "#"+$.jgrid.jqID($t.p.id)).hasClass("jqgrid-new-row")){ 
       setTimeout(function(){$($t).jqGrid("delRowData",rowid);},0); 
      } 
     } 
     if ($.isFunction(o.afterrestorefunc)) 
     { 
      o.afterrestorefunc.call($t, rowid); 
     } 
    }); 
}, 

기본적으로, 대신 행을 설정 $grid.p.savedRow 데이터를 사용하는 나는 내 문제를 해결 restoreRow 기능에 몇 가지 코드를 변경 데이터로, 나는 $grid.p.data을 사용하여 행을 복원 할 때 행 데이터를 설정합니다. 이 방법으로 소스 코드를 변경하여 나에 실행할 수있는 의도하지 않은 결과가

내가 내 fix-에 대한 피드백을 찾고 생각이 있습니까? 소스 코드를 변경하지 않고도이 수정 사항을 얻을 수있는 방법이 있습니까 (팀에서 JQGrid를 유지 보수하고 업데이트하기가 더 쉽습니다). 내가 뭔가를 제대로 이해하지 못했습니까? :)

도움을 주셔서 대단히 감사합니다! 버그 데모가 도움이된다면, 내가 만들 수 있습니다. 내 개인 웹 서버에 대한 액세스 권한이 없습니다. 당신의 제안에

답변

0

한 가지 중요한 문제는 $grid.p.data 항상없는 존재입니다. 당신이 datatype: 'json' 또는 datatype: 'xml'와 "고전"그리드를 사용하고 loadonce: true 사용하지 않을 경우 당신은 정의되지 않은 data 매개 변수가됩니다. 토니에게 코드와 addXmlData 코드를 수정하여 data 매개 변수 (the part of code 참조)를 채울 것을 제안했지만 어떤 식 으로든 jqGrid의 현재 구현이 항상 data을 채우지는 않습니다. 따라서 $t.p.data은이 경우 사용할 수 없습니다. TRUE '와'데이터 형식 : 'json'`

+0

아은, 현재 나는'loadonce를 사용합니다. 우리는 애플리케이션에있는 특정 그리드에서 'loadonce : false'로 변경하여 더 많은 성능을 얻으려고합니다. 우리가 그것을 채우는 쿼리에서 수만 개의 결과를 검색 할 가능성이 있기 때문입니다. 이 경우 서버 측에서는 필터링이 이루어지기 때문에'$ t.p.data'를 수정해야하는'restoreRow'에서 'bug'를 고칠 필요가 없습니다. 나는 단지'$ t.p.data'를 null로 검사하고 그 경우에는'$ t.p.savedRow'를 사용할 필요가 있다고 생각합니다. '$ t.p.data'에 대해 알려 주셔서 감사합니다! – icats

+0

@ icats : 안녕하세요. – Oleg