2011-03-28 131 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]); 
}