2011-04-14 64 views
7

Me preguntaba si hay una mejor manera de cargar grandes conjuntos de datos Json desde el servidor.jqgrid carga el gran conjunto de datos sin paginación

Estoy usando jqgrid como loadonce: true. Necesito cargar alrededor de 1500 registros a la vez y tampoco utilizo las opciones de paginación. ¿Hay alguna forma mejor de lograr esto? Gracias de antemano.

Este es mi código Grid -

$(function(){ 
     $("#testgrid").jqGrid({ 
      url:getGridUrl, 
      datatype: 'json', 
      mtype: 'GET', 
      height: 250, 
      colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'], 
      colModel:[ 
       {name:'id',index:'id', width:60, sorttype:"int",search:false}, 
       {name:'invdate',index:'invdate', width:90, sorttype:"date",search:false}, 
       {name:'name',index:'name', width:100,search:false}, 
       {name:'amount',index:'amount', width:80, align:"right",sorttype:"float"}, 
       {name:'tax',index:'tax', width:80, align:"right",sorttype:"float",search:false},   
       {name:'total',index:'total', width:80,align:"right",sorttype:"float",search:false},  
       {name:'note',index:'note', width:150, sortable:false,search:false}  
      ], 
      multiselect: true, 
      multiboxonly:true, 
      caption: "Manipulating Array Data", 
      pager: '#testgridpager', 
      //Auto load while scrolling 
      //scroll: true, 
      //to hide pager buttons 
      pgbuttons:false, 
      recordtext:'', 
      pgtext:'', 
      loadonce: true, 
      sortname: 'id', 
      sortorder: 'asc', 
      viewrecords: true, 
      multiselect: true, 

      jsonReader : { 
       root: "rows", 
       //page: "page", 
       //total: "total", 
       records: "records", 
       repeatitems: false, 
       cell: "cell", 
       id: "id" 
      }, 
      loadComplete: function(data) { 
      var rowId; 
      //alert(data.length); 
      //alert('load complete'+data.rows.length); 
      //set checkboxes false if mode is set to true 
      if(mode){ 
       for(var i=0;i<data.rows.length;i++){ 
        rowId=data.rows[i].id; 
        disableRow(rowId); 
        var searchVal = $("#gs_amount").val().trim(); 
        if(searchVal ==data.rows[i].amount){ 
         jQuery("#testgrid").jqGrid('setSelection',rowId); 
         //heighlightSearch(); 
        } 
       } 
      } 
     } 
    }); 
     //toolbar search 
     $("#testgrid").jqGrid('filterToolbar',{stringResult:true,searchOnEnter:false}); 
    }); 

    function disableRow(rowId){ 
    $("#testgrid").jqGrid('setRowData', rowId, false, {color:'gray'}); 
    var trElement = jQuery("#"+ rowId,$('#testgrid')); 
    trElement.removeClass("ui-state-hover"); 
    trElement.addClass('ui-state-disabled'); 
    trElement.attr("disabled",true); 
} 
+0

¿Podría incluir el código de JavaScript que usa actualmente? ¿Utiliza paginación local de los datos? ¿Utiliza el parámetro 'gridview: true'? – Oleg

+0

@Oleg - Gracias oleg. utilicé el parámetro gridView. Por favor encuentre la pregunta actualizada. – Sam

+0

@Sam: estoy muy ocupado ahora, pero si su problema no se resuelve hasta el sábado, le escribiré algunas sugerencias. ¿Qué significa 'disableRow'? No estoy seguro de entender lo que haces dentro de 'loadComplete'. Si en la barra de filtro de 'amount' no existen datos, no debe hacer nada. Si en 'cantidad' los datos existen, los datos se filtran y debe seleccionar todas las filas. ¿Es tan? Además, no veo el parámetro 'gridview: true'. ¿Es el ejemplo que publicó el ejemplo real que probó? ¿Cuánto tiempo dura la carga en sus pruebas? ¿Qué navegador es el más importante para ti? – Oleg

Respuesta

10

En el ejemplo de this demo puede ver el tiempo de carga de 1500 filas para su red en caso de uso de gridview: true.

El problema de mayor rendimiento de su ejemplo se encuentra dentro de la función loadComplete. Si necesita hacer algunas modificaciones en la cuadrícula, debe usar jQuery para manipular la cuadrícula contener. El mejor rendimiento se puede archivar si utiliza elementos DOM de la red directamente, como en el ejemplo

loadComplete: function() { 
    var i=0, indexes = this.p._index, localdata = this.p.data, 
     rows=this.rows, rowsCount = rows.length, row, rowid, rowData, className; 

    for(;i<rowsCount;i++) { 
     row = rows[i]; 
     className = row.className; 
     //if ($(row).hasClass('jqgrow')) { // test for standard row 
     if (className.indexOf('jqgrow') !== -1) { 
      rowid = row.id; 
      rowData = localdata[indexes[rowid]]; 
      if (rowData.amount !== "200") { 
       // if (!$(row).hasClass('ui-state-disabled')) { 
       if (className.indexOf('ui-state-disabled') === -1) { 
        row.className = className + ' ui-state-disabled'; 
       } 
       //$(row).addClass('ui-state-disabled'); 
      } 
     } 
    } 
} 

Se puede ver el ejemplo correspondiente viven here.

En la implementación de loadComplete función utilizo el hecho, que jqGrid tener loadonce:true uso parámetro parámetros internos _index y data que pueden utilizarse para acceder a la contiene de la cuadrícula. En el ejemplo, desactivé las filas que no contienen "200" en la columna amount.

ACTUALIZADO: The answer describe cómo utilizar rowattr de devolución de llamada para simplificar la solución y tener el mejor rendimiento (en el caso de gridview: true de la causa).

+0

@ Oleg- Muchas gracias Oleg. ahora obtengo la línea de base de ** El mejor rendimiento que puede archivar si usa la frase ** elementos DOM. ejemplos son realmente útiles. Gracias por compartir el conocimiento y la orientación amable. Agradecemos enormemente su tiempo y esfuerzo. – Sam

+0

@Sam: ¡De nada! – Oleg

1

estaría tentado a mirar en la carga automática en función de desplazamiento de jqGrid. Nunca cargaría 1500 filas por adelantado. ¿Alguna razón por la que no puedes buscar?

+0

gracias por la vuelta. El requisito no es usar la paginación. Solía ​​ver scroll: true function y encontré [this] (http://jollyroger.kicks-ass.org/grid_test/) artículo. Es por eso que me pregunto cuál será la mejor manera de usar. – Sam

+0

@Sam - el problema tal vez sea su js/php quién sabe. Yo probaría por mí mismo. Estoy seguro de que otros habrían mencionado y ahora está en la versión 4.0. – redsquare

Cuestiones relacionadas