인라인 행 편집 (행을 편집 상태에 넣고 $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를 유지 보수하고 업데이트하기가 더 쉽습니다). 내가 뭔가를 제대로 이해하지 못했습니까? :)
도움을 주셔서 대단히 감사합니다! 버그 데모가 도움이된다면, 내가 만들 수 있습니다. 내 개인 웹 서버에 대한 액세스 권한이 없습니다. 당신의 제안에
아은, 현재 나는'loadonce를 사용합니다. 우리는 애플리케이션에있는 특정 그리드에서 'loadonce : false'로 변경하여 더 많은 성능을 얻으려고합니다. 우리가 그것을 채우는 쿼리에서 수만 개의 결과를 검색 할 가능성이 있기 때문입니다. 이 경우 서버 측에서는 필터링이 이루어지기 때문에'$ t.p.data'를 수정해야하는'restoreRow'에서 'bug'를 고칠 필요가 없습니다. 나는 단지'$ t.p.data'를 null로 검사하고 그 경우에는'$ t.p.savedRow'를 사용할 필요가 있다고 생각합니다. '$ t.p.data'에 대해 알려 주셔서 감사합니다! – icats
@ icats : 안녕하세요. – Oleg