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

标签 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/

最佳答案

我建议您使用内联编辑的 serializeSaveData 回调或旧版本 jqGrid 的 serializeRowData 回调。回调允许您自定义将发送到服务器的数据。修改后的demo 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/

关于javascript - jqgrid - 内联编辑,仅发布更改的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33503105/

相关文章:

javascript - 我已经使用append添加了HTML代码,但是这个新代码不再执行javascript

javascript - jquery 网格中的过滤器工具栏中未填充下拉列表

jquery-ui - Jqgrid-在使用上下文菜单时如何保留悬停的样式

javascript - 我怎样才能切换到折叠状态?

javascript - 如何从 `/code/program.js` 访问 bixby 胶囊中的 Bixby/三星个人资料信息(名字/姓氏)

javascript - react 图像 onClick 以显示在另一个组件中?

javascript - 如何使用 Bluebird promise NodeJS Express

javascript - 我如何在点击功能其他元素中使用 this.value

Javascript/jQuery 将鼠标悬停在单独的元素上

javascript - jqGrid 中的动态列和使用下拉列表