对于值不变的单元格,调用什么函数?

时间:2015-12-02 12:39:12

标签: javascript jqgrid

在未更改的值上调用saveCell时调用哪个函数?如果单元格的前一个值为100saveCell在未更改的值100上调用,则beforeSaveCellbeforeSubmitCell都不会被调用。我怎么能处理这个案子?

我正在使用jqGrid 4.6.0

1 个答案:

答案 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是否可编辑。如果您确切知道哪个可编辑类型具有该列以及您是否使用冻结列,则可以简化代码