【问题标题】:jqGrid row(s) deletionjqGrid 行删除
【发布时间】:2011-07-24 19:16:50
【问题描述】:

我有一个按钮,用于在选中调用内置函数“delRowData”时删除一行。很简单,直到您想要删除一组行/多行(如内置变量'selarrrow')。有没有人比我想出的可怕的垃圾有更好的答案(例如修改核心 jqGrid 代码)?

这是我的代码:

$("#deleteButton").click(function(){ var gr = jQuery("#myGrid").jqGrid('getGridParam','selarrrow'); var su=jQuery("#myGrid").jqGrid('delRowData',gr.toString()); (苏)? '' : alert("已经删除或不在列表中"); });

现在是在 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')); 控制台.log(值); } 别的{ console.log($("#myGrid").jqGrid('getGridParam','selarrrow')); 控制台.log(值); } }); });

您会看到代码无法正确执行,我们必须返回查看“delRowData”的 jqGrid 核心代码函数。现在的问题在于它如何处理数组。这是未缩小的函数:

delRowData:函数(f){ 变量 j=false,i,c; this.each(函数(){ 变量 e=这个; if(i=e.rows.namedItem(f)){ b(i).remove(); e.p.记录——; e.p.reccount--; e.updatepager(true,false); j=真; 如果(e.p.多选){ c=b.inArray(f,e.p.selarrrow); //c!=-1&&e.p.selarrrow.splice(c,1) } 如果(f==e.p.selrow) e.p.selrow=null }别的 返回假; if(e.p.datatype=="local"){ var k=e.p._index[f]; if(typeof k!="undefined"){ e.p.data.splice(k,1); e.refreshIndex() } } 如果(e.p.altRows===true&&j){ var n=e.p.altclass; b(e.rows).each(函数(a){ a%2==1?b(this).addClass(n):b(this).removeClass(n) }) } }); 返回 j }

问题在于函数中间的注释行。我真的很想避免破解核心代码,但似乎你必须这样做,除非你有更好的主意。

【问题讨论】:

    标签: javascript jquery-plugins jqgrid


    【解决方案1】:

    问题在于 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/

    【讨论】:

    • 这应该是问题的正确解决方案,但请确保您设置了$.jgrid.no_legacy_api = false;,否则会失败。
    【解决方案2】:

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

    var selrows = $('#grid').jqGrid('getGridParam', 'selarrrow');
    
    while (selrows.length > 0)
    {
      $('#grid').delRowData(selrows[0]);
    }
    

    【讨论】:

      【解决方案3】:

      为什么不使用每个外部,而不是破解核心?

      $("#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(', ')); 
        }
      }); 
      

      【讨论】:

      • 我尝试更改您的代码以使其正常工作(例如,每个()而不是 foreach())但无济于事。返回的错误是:jQuery("#myGrid").jqGrid('getGridParam','selarrrow').foreach is not a function
      • 对不起,那是我的错。应该只是.each() -- 我已经更新了
      • 嘿,加里,感谢您尝试一下。我尝试了 .each 方法,但它返回的错误与我上次评论中尝试 foreach 时的错误相同。需要的函数是 $.each 方法,它可以处理数组,而 .each 只迭代对象。我在此基础上进行了新的修改。
      猜你喜欢
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2013-08-22
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多