我有一个按钮用于在选中时删除一行,该按钮调用内置函数“delRowData”。足够简单,直到您想要删除行/多行的数组(如在内置变量“selarrrow”中)。有没有人有比我想出的可怕的烂摊子更好的答案(例如修改核心 jqGrid 代码)?
这是我的代码:
$("#deleteButton").click(function(){ var gr = jQuery("#myGrid").jqGrid('getGridParam','selarrrow'); var su=jQuery("#myGrid").jqGrid('delRowData',gr.toString()); (su) ? '' : alert("Already deleted or not in list"); });
and now for the really nasty part of modifying core code in jquery.jqGrid.min.js:
delRowData:function(f){
for(var m=0,max=f.length;m<max;m++){
var j=false,i,c;
this.each(function(){
var e=this;
if(i=e.rows.namedItem(f[m])){
b(i).remove();
e.p.records--;
e.p.reccount--;
e.updatepager(true,false);
j=true;
if(e.p.multiselect){
c=b.inArray(f[m],e.p.selarrrow);
c!=-1&&e.p.selarrrow.splice(c,1)
}
if(f==e.p.selrow)e.p.selrow=null
}else return false;
if(e.p.datatype=="local"){
var k=e.p._index[f[m]];
if(typeof k!="undefined"){
e.p.data.splice(k,1);
e.refreshIndex()
}
}
});
}
/*if(e.p.altRows===true&&j){
var n=e.p.altclass;b(e.rows).each(function(a){
a%2==1?b(this).addClass(n):b(this).removeClass(n)
})
}*/
return j
}
有更好的方法吗?
/* 新细节**/
因此,即使我们在使用 jqGrid 的默认“delRowData”函数时迭代给定的 jqGrid 数组“selarrrow”并逐行删除:
$("#deleteButton").click(function(){ $.each($("#myGrid").jqGrid('getGridParam','selarrrow'), function(index, value) { console.log($("#myGrid").jqGrid('getGridParam','selarrrow')); if ($("#myGrid").jqGrid('delRowData', value)) { console.log($("#myGrid").jqGrid('getGridParam','selarrrow')); console.log(value); } else{ console.log($("#myGrid").jqGrid('getGridParam','selarrrow')); console.log(value); } }); });
您会看到代码没有正确执行,我们必须回过头来查看“delRowData”的 jqGrid 核心代码函数。现在的问题在于它如何处理数组。这是未缩小的函数:
delRowData:function(f){ var j=false,i,c; this.each(function(){ var e=this; if(i=e.rows.namedItem(f)){ b(i).remove(); e.p.records--; e.p.reccount--; e.updatepager(true,false); j=true; if(e.p.multiselect){ c=b.inArray(f,e.p.selarrrow); //c!=-1&&e.p.selarrrow.splice(c,1) } if(f==e.p.selrow) e.p.selrow=null }else return false; if(e.p.datatype=="local"){ var k=e.p._index[f]; if(typeof k!="undefined"){ e.p.data.splice(k,1); e.refreshIndex() } } if(e.p.altRows===true&&j){ var n=e.p.altclass; b(e.rows).each(function(a){ a%2==1?b(this).addClass(n):b(this).removeClass(n) }) } }); return j }
问题出在函数中间被注释掉的那一行。我真的很想避免破解核心代码,但除非你有更好的主意,否则你似乎不得不这样做。
最佳答案
问题是 getGridParam 正在返回对选定行的引用 (selarrrow)。然后,您使用它来遍历网格中的删除行,这会修改您标识的行上的 selarrow。这会更改您正在迭代的集合,以便后续迭代不再指向正确的值。
您可以使用 $.MakeArray 遍历所选数组的副本,或者从数组的尾部开始迭代,例如:
var ids = $('#grid').getGridParam('selarrrow');
for ( var i = ids.length-1; i>=0; i--) {
$('#grid').delRowData(ids[i]);
}
在以下位置对此进行了讨论:http://www.trirand.com/blog/?page_id=393/bugs/delrowdata-bug-on-grid-with-multiselect/
关于javascript - jqGrid 行删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5464824/