我有一个 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);
}
}]
}
}],
在这个网格中,我的两个列是可编辑的。现在假设如果我在内联编辑中对任何行的其中一列进行更改,则只应发布该单元格的值。当前功能发布该特定行的所有单元格。这可能吗?
我发现了一些问题 here和 there关于这个,但似乎没有人在解决这个具体问题。
基本上我能想到的想法是,在保存之前,如果我能以某种方式将该行所有可编辑单元格的原始数据与发布前的新值进行比较,我就可以删除数据没有的单元格更改并仅发布已更改的单元格。
最佳答案
我建议您使用内联编辑的 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;
}
}
关于javascript - jqgrid - 内联编辑,仅发布更改的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33503105/