Tengo un botón para eliminar una fila cuando se comprueba que llama a la función integrada ‘delRowData’. Bastante Simple, hasta que desea quitar una matriz de filas/varias filas (como en la construcción-en la variable ‘selarrrow’). ¿Alguien tiene una respuesta mejor que la horrible muck me he venido arriba con (por ejemplo. modificación del núcleo jqGrid código)??

Aquí está mi código:

 $("#deleteButton").click(function(){ 
var gr = jQuery("#myGrid").jqGrid('getGridParam','selarrrow'); 
var ub=jQuery("#myGrid").jqGrid('delRowData',gr.toString()); 
(su) ? ": alert("Ya eliminado o no en la lista"); 
}); 

y ahora por la desagradable verdad de parte de la modificación de código de núcleo en 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
}

Hay una manera mejor de hacer esto?

/* Nuevos detalles **/

Así que incluso si repetimos durante el jqGrid matriz ‘selarrrow» y eliminar las filas, uno por uno, mientras que el uso de jqGrid por defecto de ‘delRowData función:

$("#deleteButton").click(function(){ 
$.cada uno($("#myGrid").jqGrid('getGridParam','selarrrow'), función(índice, valor) { 
la consola.log($("#myGrid").jqGrid('getGridParam','selarrrow')); 
if ($("#myGrid").jqGrid('delRowData', value)) { 
la consola.log($("#myGrid").jqGrid('getGridParam','selarrrow')); 
la consola.de registro(valor); 
} 
else{ 
la consola.log($("#myGrid").jqGrid('getGridParam','selarrrow')); 
la consola.de registro(valor); 
} 
}); 
}); 

verá el código no realiza correctamente y tenemos que volver a mirar el jqGrid core-código de la función de ‘delRowData’. El problema ahora está en como se aborda la matriz. He aquí la función de la onu-record:

delRowData:función(f){ 
var j=false,i,c; 
este.each(function(){ 
var e=este; 
si(i=e.las filas.namedItem(f)){ 
b(i).remove(); 
e.p.registros--; 
e.p.reccount--; 
e.updatepager(true,false); 
j=true; 
si(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; 
si(e.p.datatype=="local"){ 
var k=e.p._index[f]; 
if(typeof k!="undefined"){ 
e.p.de datos.splice(k,1); 
e.refreshIndex() 
} 
} 
si(e.p.altRows===true&&j){ 
var n=e.p.altclass; 
b(e.filas).cada uno(función de(a){ 
a%2==1?b(este).addClass(n):b(este).removeClass(n) 
}) 
} 
}); 
regreso j 
} 

El problema es el comentario de la línea en el medio de la función. Yo realmente quería evitar la piratería núcleo de código, pero parece que usted tiene que hacerlo, a menos que usted tiene una mejor idea.

3 Comentarios

  1. 0

    ¿Por qué no utilizar cada uno fuera, en lugar de cortar el núcleo?

    $("#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(', ')); 
      }
    }); 
    • He intentado modificar el código para que funcione (por ejemplo. cada() en lugar de un foreach ()), pero fue en vano. El error devuelto es: jQuery(«#myGrid»).jqGrid(‘getGridParam’,’selarrrow’).foreach no es una función
    • Lo siento, ese es mi mal. Debe ser sólo .each() – he actualizado
    • Hola Gary, gracias por tener un ir en esto. He probado el .cada método, pero se devuelve el mismo error, como tratando de foreach como en mi último comentario. La función necesitada es de $.cada método que puede manejar matrices, mientras que .cada uno sólo itera a través de los objetos. He hecho nuevas modificaciones sobre esta base.
  2. 5

    El problema es que getGridParam devuelve una referencia a las filas seleccionadas (selarrrow). A continuación, utilice esto para iterar a través de una eliminar filas de la cuadrícula, de la cual se modifica selarrow en la línea que usted ha identificado. Esto cambia la colección que estamos iterando, por lo que las iteraciones posteriores no apuntan a los valores correctos.

    Puede utilizar $.MakeArray para iterar a través de una copia del seleccionado matrices, o recorrer desde la cola de la matriz, por ejemplo:

    var ids = $('#grid').getGridParam('selarrrow');
    for (  var i = ids.length-1; i>=0; i--) {
      $('#grid').delRowData(ids[i]);
    }

    Hay un debate sobre esto en: http://www.trirand.com/blog/?page_id=393/bugs/delrowdata-bug-on-grid-with-multiselect/

    • Esta debería ser la solución correcta para el problema, pero asegúrese de que establece $.jgrid.no_legacy_api = false; o se producirá un error.
  3. 2

    jqGrid elimina la fila eliminada de selarrrow de flecha también.
    Una de las manera de hacer múltiples eliminación de fila es el uso de

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

Dejar respuesta

Please enter your comment!
Please enter your name here