在未更改的值上调用saveCell
时调用哪个函数?如果单元格的前一个值为100
且saveCell
在未更改的值100
上调用,则beforeSaveCell
和beforeSubmitCell
都不会被调用。我怎么能处理这个案子?
我正在使用jqGrid 4.6.0
答案 0 :(得分:1)
单元格编辑按以下方式工作:jqGrid将可编辑行/单元格的内容保存在jqGrid savedRow
的内部参数内,其类型为数组。方法saveCell
(或使用内联编辑的cae中的savedRow
)将可编辑单元格中的当前值与之前保存的内容(来自savedRow
)进行比较。如果在编辑期间未进行任何更改,则将调用restoreCell
。只有在将Ajax调用发送到服务器(beforeSaveCell
)或者需要在本地保存所需的更改(beforeSubmitCell
)时,才会调用回调cellsubmit: "remote"
和cellsubmit: "clientArray"
。在服务器或本地成功保存数据后,将调用回调afterSaveCell
。
您写道,您在代码中明确地调用了saveCell
。因此,您可以在调用saveCell
之前检查单元格是否已更改。您需要做的是包括下面的代码测试:
// below code uses $grid, which is jQuery wrapper to jqGrid (like $grid = $("#grid"))
// it uses additionally iRow and iCol variables which you use as parameters
// of the call of saveCell
var $t = $grid[0], // $t is the DOM of the grid
p = $grid.jqGrid("getGridParam"), // get reference to all jqGrid parameters
getTdByColumnIndex = function (tr, iCol) {
// the function getTdByColumnIndex return jQuery wrapper
// to one or two <td> elements. If frozen column is used
// and the column iCol is frozen then the function
// returns the wrapper to two <td> elements: one from
// frozen div and another from original grid
var $t = this, frozenRows = $t.grid.fbRows;
return $((frozenRows != null && frozenRows[0].cells.length > iCol ?
frozenRows[tr.rowIndex] :
tr).cells[iCol]);
},
tr = $t.rows[iRow], rowid = tr.id, $tr = $(tr), cm = p.colModel[iCol],
savedRow = p.savedRow,
fr = savedRow.length >= 1 ? 0 : null,
nm = cm.name, v, cc = getTdByColumnIndex.call($t, tr, iCol);
v = $.jgrid.getEditedValue.call($t, cc, cm, !cm.formatter);
if (v !== savedRow[fr].v) {
// the cell is changed you can call saveCell
// and you will be sure that the changes will be saved
} else {
// the cell is not changed
// you can call
// $grid.jqGrid("restoreCell", iRow, iCol);
// directly
}
我从现有的免费jqGrid代码中获取上述代码。此外,首先,应该测试列iCol
是否可编辑。如果您确切知道哪个可编辑类型具有该列以及您是否使用冻结列,则可以简化代码