jqgrid - 内联编辑,仅发布已更改的数据

时间:2015-11-03 15:36:19

标签: javascript jquery jqgrid free-jqgrid

我有一个jqGrid,我想检查单元格数据,只发布数据已更改的列。

请考虑这是我的colModel

colModel: [{
    name: 'I_PK',
    index: 'u.I_PK',
    align: 'right',
    editable: false,
    sopt: ['cn', 'eq', 'ne', 'lt', 'le', 'gt', 'ge', 'bw', 'ew', 'nc']
}, {
    name: 'W3LabelSelected',
    index: 'u.W3LabelSelected',
    align: 'center',
    width: 170,
    editable: false,
    edittype: 'checkbox',
    formatter: "checkbox",
    search: false,
    formatoptions: {
        disabled: false
    },
    editoptions: {
        value: "1:0"
    }
}, {
    name: 'I_ItemNumID',
    index: 'u.I_ItemNumID',
    align: 'right',
    editable: true,
    editoptions: {
        dataEvents: [{
            type: 'focusin',
            fn: function (e) {
                var elem = e.target;
                setTimeout(function () {
                    elem.select();
                }, 50);
            }
        }]
    }
}, {
    name: 'Quantity',
    index: 'u.Quantity',
    align: 'right',
    editable: true,
    editoptions: {
        dataEvents: [{
            type: 'focusin',
            fn: function (e) {
                var elem = e.target;
                setTimeout(function () {
                    elem.select();
                }, 50);
            }
        }]
    }
}],

在此网格中,我的两列可编辑。现在让我们说如果我在内联编辑中的任何一行的列中进行更改,那么只应该发布该单元格的值。当前功能发布该特定行的所有单元格。这可能吗?

我发现了一些问题herethere,但似乎都没有解决这个具体问题。

基本上我能想到的想法是,在保存之前,如果我能以某种方式将该行的所有可编辑单元格的原始数据与发布之前的新值进行比较,我可以消除数据没有的单元格更改并仅发布已更改的单元格。

示例网格:http://jsfiddle.net/dipenshah8/HJema/203/

1 个答案:

答案 0 :(得分:3)

我建议您使用内联编辑的serializeSaveData回调或旧版jqGrid的serializeRowData回调。回调允许您自定义将发送到服务器的数据。修改后的演示http://jsfiddle.net/OlegKi/HJema/206/使用以下选项:

inlineEditing: {
    keys: true,
    serializeSaveData: function (postData) {
        var changedData = {}, prop, p = $(this).jqGrid("getGridParam"),
            idname = p.keyName || p.prmNames.id;

        for (prop in postData) {
            if (postData.hasOwnProperty(prop) &&
                (postData[prop] !== p.savedRow[0][prop] || prop === idname)) {
                changedData[prop] = postData[prop];
            }
        }
        alert(JSON.stringify(changedData));
        return changedData;
    }
}

serializeSaveData回调的代码枚举默认情况下将发送到服务器的所有属性,并生成新对象changedData而不是postData。该代码将postData的所有属性的值与savedRow[0]参数的对应值进行比较,该参数包含开始编辑之前的行。

更新:如果数据可能有formatter: "date",则上述代码应该更复杂一些。 jqGrid会在savedRow[0]中保存格式化值。可以将以上代码修改为以下内容:

inlineEditing: {
    keys: true,
    serializeSaveData: function (postData) {
        var changedData = {}, prop, p = $(this).jqGrid("getGridParam"),
            idname = p.keyName || p.prmNames.id,
            oldValue, cm, formatoptions;

        for (prop in postData) {
            oldValue = p.savedRow[0][prop];
            if (p.iColByName[prop] != null) {
                cm = p.colModel[p.iColByName[prop]];
                formatoptions = cm.formatoptions || {};
                if (cm.formatter === "date" && formatoptions.sendFormatted !== true) {
                    oldValue = $.unformat.date.call(this, oldValue, cm);
                }
            }
            if (postData.hasOwnProperty(prop) &&
                    (postData[prop] !== oldValue || prop === idname)) {
                changedData[prop] = postData[prop];
            }
        }
        alert(JSON.stringify(changedData));
        return changedData;
    }
}

请参阅修改后的演示http://jsfiddle.net/OlegKi/HJema/209/