jqGrid:表单编辑保存到行中,但来回分页时所有更改都丢失
我正在对本地数据使用表单编辑。我可以编辑表单中的值并将值设置回行(使用setRowData)但当我前后翻页时,更改会丢失。 如何在网格中保存对行和基础源的更改?稍后,我必须迭代行,验证所有错误是否已更正(使用编辑表单),并将其发布到服务器 代码: 谢谢你的帮助jqGrid:表单编辑保存到行中,但来回分页时所有更改都丢失,jqgrid,form-editing,Jqgrid,Form Editing,我正在对本地数据使用表单编辑。我可以编辑表单中的值并将值设置回行(使用setRowData)但当我前后翻页时,更改会丢失。 如何在网格中保存对行和基础源的更改?稍后,我必须迭代行,验证所有错误是否已更正(使用编辑表单),并将其发布到服务器 代码: 谢谢你的帮助 谢谢我想您出现问题的原因是在localReader中使用了输入数据的数组格式(repeatitems:true)。我假设您需要从postdata构建数组,并将其用作setRowData的参数,而不是postdata 如果这个建议对您没有帮
谢谢我想您出现问题的原因是在
localReader
中使用了输入数据的数组格式(repeatitems:true
)。我假设您需要从postdata
构建数组,并将其用作setRowData
的参数,而不是postdata
如果这个建议对您没有帮助,您应该发布更完整的网格代码和测试数据。像colModel:getColModel(),
这样的代码实际上没有帮助。换句话说,你应该发布足够的信息来重现问题。最好是一个工作中的演示。如果您准备这样的演示,请使用jquery.jqGrid.src.js
而不是jquery.jqGrid.min.js
更新:代码中的问题是,如果输入数据
,则使用数组是项(您在localReader
中使用repeatitems:true
)。在这种情况下,setRowData
的当前实现不支持(工作不正确)。例如,如果您最初有这样的数据
然后开始编辑第三行,您将看到如下内容
使用后,使用类似的$('#mygrid').jqGrid('setRowData',postdata.row,postdata)代码>在onclickSubmit
的内部。因此,内部数据将被错误地修改
要解决此问题,我建议通过包含以下代码覆盖当前的setRowData
实现
$.jgrid.extend({
setRowData:函数(rowid、数据、cssp){
var nm,success=true,title;
这个。每个(函数(){
如果(!this.grid){return false;}
var t=this,vl,ind,cp=typeof cssp,lcdata=t.p.datatype==“local”和&t.p.localReader.repeatitems===true?[]:{},iLocal=0;
ind=$(this.jqGrid('getGridRowById',rowid);
如果(!ind){return false;}
如果(数据){
试一试{
$(this.p.colModel)。每个(函数(i){
nm=这个名称;
var dval=$.jgrid.getAccessor(数据,nm);
如果(dval!==未定义){
vl=this.formatter&&typeof this.formatter=='string'&&this.formatter=='date'?$.unformat.date.call(t,dval,this):dval;
if(t.p.datatype==“local”&&t.p.localReader.repeatitems===true){
lcdata[iLocal]=vl;
}否则{
lcdata[nm]=vl;
}
vl=t.formatter(rowid,dval,i,data,'edit');
title=this.title?{“title”:$.jgrid.stripHtml(vl)}:{};
if(t.p.treeGrid==true&&nm==t.p.ExpandColumn){
$($td[role='gridcell']:eq(“+i+”)>span:first,ind).html(vl.attr(title);
}否则{
$(“td[role='gridcell']:eq(“+i+”),ind.html(vl.attr)(title);
}
}
如果(nm!=“cb”&&nm!=“子网格”&&nm!=“rn”){
iLocal++;
}
});
如果(t.p.datatype=='local'){
变量id=$.jgrid.stripPref(t.p.idPrefix,rowid),
pos=t.p.\U索引[id],键;
如果(t.p.treeGrid){
用于(输入t.p.treeReader){
if(t.p.treeReader.hasOwnProperty(键)){
删除lcdata[t.p.treeReader[key]];
}
}
}
如果(位置!==未定义){
t、 p.data[pos]=$.extend(true,t.p.data[pos],lcdata);
}
lcdata=null;
}
}捕获(e){
成功=错误;
}
}
如果(成功){
if(cp=='string'){$(ind).addClass(cssp);}否则if(cssp!==null&&cp=='object'){$(ind).css(cssp);}
$(t).triggerHandler(“jqGridAfterGridComplete”);
}
});
回归成功;
}
});
稍后我会将我的建议发布到trirand。因此,我们可以希望这个问题能在下一版本的jqGrid中得到解决。Oleg说,“你问题中的代码没有使用我在这里引用的代码。演示中没有你描述的问题。”@Oleg是的,我引用了你演示中的代码,但实际上借用了部分代码,而不是整个onclickSubmitLocal函数。我不知道我错过了什么@Oleg,我已经将演示与我的代码(上面已更新)进行了比较,但无法使其正常工作。有些东西不见了,不知道是什么!如果我将repeatitems设置为false,则网格行为空。尝试克隆传递给setRowData的对象,但不起作用;更改丢失。已经创建了一个示例(几乎接近我的真实代码):。您应该能够在机器上本地运行它。@Vivekragunahan:我更新了我的答案。setRowData
方法的新(固定)实现应该可以解决您的问题。从外观上看,将输入数据设置为JSON而不是数组似乎更安全。但我不会那么做。因为
var gridId = 'mygrid';
var pagerId = 'mygridpager';
var grid = $('#mygrid');
var pager = $('#mygridpager');
grid.jqGrid({
caption: caption,
colModel: getColModel(),
recreateForm: true,
hidegrid: true,
sortorder: 'desc',
viewrecords: true,
multiselect: true,
rownumbers: true,
autowidth: true,
height: '100%',
scrollOffset: 0,
datatype: 'local',
data: dataAsArray,
localReader: {
repeatitems: true,
cell: '',
id: 2
},
pager: '#' + pagerId,
pgbuttons: true,
rowNum: 5,
rowList: [2, 5, 7, 10, 250, 500]
});
grid.jqGrid('navGrid',
'#' + pagerId,
{
add: false,
del: false,
search: false,
edit: true,
edittext: 'Fix Error',
editicon: 'ui-icon-tag',
editurl: 'clientArray',
refreshtext: 'Refresh',
recreateForm: true
},
{
// edit options
editCaption: 'Fix Error',
editurl: 'clientArray',
recreateForm: true,
beforeShowForm: function(form) {
/* Custom style for elements. make it disabled etc */
},
onclickSubmit: function(options, postdata) {
var idName= $(this).jqGrid('getGridParam').prmNames.id;
// [UPDATED]
if (postdata[idName] === undefined) {
var idInPostdata = this.id + "_id";
postdata[idName] = postdata[idInPostdata];
postdata['row'] = postdata[idInPostdata];
}
$('#mygrid').jqGrid('setRowData', postdata.row, postdata);
if (options.closeAfterEdit) {
$.jgrid.hideModal('#editmod' + gridId, {
gb: '#gbox_' + gridId,
jqm: options.jqModal,
onClose: options.onClose
});
}
options.processing = true;
return {};
}
},
{}, // add options
{}, // del options
{} //search options
).trigger('reloadGrid');