Удаление строк (й) jqGrid - PullRequest
2 голосов
/ 29 марта 2011

У меня есть кнопка, используемая для удаления строки при проверке, которая вызывает встроенную функцию 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"); 
        }); 

и теперь по-настоящему неприятная часть изменения кода ядра в 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» и удалим строки одну за другой, используя стандартную функцию jRGrid «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);
        }
    });
}); 

вы увидите, что код работает неправильно имы должны вернуться к функции основного кода jqGrid в delRowData.Проблема сейчас заключается в том, как она справляется с массивом.Вот функция uninified:

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
}

Проблема в закомментированной строке в середине функции.Я действительно хотел избежать взлома кода ядра, но, похоже, вам придется это делать, если у вас нет лучшей идеи.

Ответы [ 3 ]

5 голосов
/ 08 мая 2011

Проблема в том, что 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/

2 голосов
/ 04 июня 2014

jqGrid удаляет удаленную строку из selarrrow - стрелка также. Одним из способов удаления нескольких строк является использование

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

while (selrows.length > 0)
{
  $('#grid').delRowData(selrows[0]);
}
0 голосов
/ 29 марта 2011

Почему бы не использовать каждый снаружи вместо взлома ядра?

$("#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(', ')); 
  }
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...