2011-03-28 114 views
2

我有一个按钮用于删除一行时,检查调用内置函数'delRowData'。很简单,直到你想删除一行/多行(如在内置变量'selarrrow')。有没有人比我想出来的可怕的垃圾有更好的答案(例如修改核心jqGrid代码)?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"); 
     }); 

和现在的修改核心代码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数组“selarrrow”和一个删除的行之一,而使用的jqGrid默认的“delRowData”功能:

 
$("#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 
} 

问题是在函数中间注释掉了一行。我真的想避免黑客入侵核心代码,但似乎你必须这样做,除非你有更好的主意。

回答

0

为什么不使用每个外部,而不是黑客的核心?

$("#deleteButton").click(function(){ 
    var errors = []; 
    jQuery("#myGrid").jqGrid('getGridParam','selarrrow').each(function(index, value) { 
    if (!jQuery("#myGrid").jqGrid('delRowData', value)) errors.push(value); 
    }); 
    if (errors.length) 
    { 
    alert('Already deleted or not in list on row(s): ' + errors.join(', ')); 
    } 
}); 
+0

我试着改变你的代码来得到它的工作(例如每()代替的foreach()),但无济于事。返回的错误是:jQuery(“#myGrid”)。jqGrid('getGridParam','selarrrow')。foreach不是函数 – 2011-03-31 21:37:39

+0

对不起,这是我的错。应该只是'.each()' - 我已经更新了它 – 2011-03-31 22:00:24

+0

嘿加里,谢谢你在这里。我尝试了.each方法,但它返回了与我上次评论中一样的尝试foreach的错误。所需的函数是$ .each方法,它可以处理数组,而每个只能遍历对象。我根据这个做了新的编辑。 – 2011-04-01 20:25:11

4

问题是,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/

+0

这应该是问题的正确解决方案,但请确保设置了'$ .jgrid.no_legacy_api = false;',否则它将失败。 – Teiv 2012-02-04 14:32:24

2

jqGrid也从selarrrow中删除已删除的行 - 箭头。 的做多行删除的方法之一是使用

var selrows = $('#grid').jqGrid('getGridParam', 'selarrrow'); 

while (selrows.length > 0) 
{ 
    $('#grid').delRowData(selrows[0]); 
}