Я заметил, что при использовании встроенного редактирования строки (перевод строки в состояние редактирования с помощью $grid.jqGrid('editRow', rowId, ...etc)
) и последующего восстановления строки ($grid.jqGrid('restoreRow',rowToRestore);
) без фактического редактирования строки для $grid.p.data[{indexofrowrestored}][{columnname}]
отформатированного столбца устанавливается значениеформатированное значение, а не исходное значение столбца.
Последствия этого состоят в том, что входные данные фильтра панели инструментов восстановленной строки будут фильтровать строку на основе отформатированного значения, а не неотформатированного значения (как и все остальные строки).
Я пошелчерез источник JQGrid и придумали решение для этой проблемы (JQGrid v4.3.1).Я изменил некоторый код в функции restoreRow
, которая решает мою проблему:
Начиная со строки 9038 jquery.jqGrid.src.js
(см. Комментарии для добавления кода):
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
для установки данных строки, я использую $grid.p.data
для установки данных строки, как при восстановлении строки.
Полагаю, мне нужны отзывы о моем исправлении. Могут ли я столкнуться с непредвиденными последствиями, изменив исходный код таким образом?Есть ли способ, которым я могу достичь этого исправления без изменения исходного кода (моей команде проще поддерживать и обновлять JQGrid)?Я что-то не правильно понимаю?:)
Большое спасибо за любую помощь!Если бы демонстрация ошибки была полезной, я мог бы создать ее.У меня нет доступа к моему личному веб-серверу здесь.