Cargando más de 10k filas de JSON en jqGrid 1k filas a la vez

Introducción

Cargo un objeto JSON a través de ajax en el navegador fuera de jqGrid. Luego cargo el JSON en una cuadrícula, cuya configuración inicial datatype: "local", usando lo siguiente:

  $("#myGrid").jqGrid("setGridParam", {datatype: "json", loadonce: true});
  $("#myGrid")[0].addJSONData(jsonObject);
  $("#myGrid").jqGrid("setGridParam", {datatype: "local", loadonce: true});

Lo anterior engaña a la cuadrícula para que me permita cargar un objeto JSON sin que jqGrid lo llame automáticamente (que es su comportamiento predeterminado).

La implementación de la paginación del lado del servidor sería ideal, pero actualmente no es factible en mi caso.

La pregunta

Necesito cargar entre 10 y 20 1 filas en la cuadrícula desde JSON. Pero eso toma varios segundos. Para aumentar el rendimiento, intento agregar 1k filas de un objeto JSON a la vez (que es rápido y no detiene el navegador), pero no sé cómo hacerlo con un objeto JSON en mis manos. . Aquí está mi intento, que carga las primeras XNUMXk filas en la cuadrícula, pero no actualiza correctamente el buscapersonas y no me permite agregar filas adicionales a través de addJSONData.

$("#myGrid").jqGrid({
  jsonReader: {
    page: function(json) { return 1; },
    records: function(json) { return json.records; },
    repeatitems: false,
    root: "objects",
    total: function(json) { return json.totalPages; }
  },
  // . . .
}

$.jgrid.extend({
  loadJsonFirstPageOnly: function(json) {
    return this.each(function() {
      // copy the first page of data into a truncated JSON object to load into the grid
      var resultsPerPage = $("#" + this.id + "_ResultsPerPage").val();
      var numberOfPages = parseInt(json.objects.length / resultsPerPage);
      var firstPageData = {"objects": [], "pages": numberOfPages, "records": json.objects.length};
      for (var i = 0; i < 1000 && i < json.objects.length; i++) {
        firstPageData.objects[i] = json.objects[i];
      }
      // load the truncated JSON object into the grid
      var $this = $(this).jqGrid("setGridParam", {datatype: "json", loadonce: true});
      this.addJSONData(firstPageData);
      $this.jqGrid("setGridParam", {datatype: "local", loadonce: true});
      // adjust the grid's internal state
      this.p.allData = json;
    });
  }
});

¿Alguna idea? ¡Gracias!

preguntado el 12 de junio de 12 a las 19:06

"la paginación del lado del servidor sería ideal, pero actualmente no es factible en mi caso". - Pero esa suele ser la mejor manera. Cualquier otra cosa probablemente será solo una solución de pirateo que no resuelva el problema. ¿No puede hablar con la administración sobre la modificación de la capa del servidor? Quiero decir, para mí esto parece un gran descuido de diseño en la capa del servidor. -

La paginación del lado del servidor definitivamente se implementará, pero no hasta dentro de un par de meses, y se espera un aumento de la velocidad de inmediato, de ahí este experimento de piratería. -

¿Por qué obtienes los datos de la cuadrícula en partes? ¿Cuántas columnas tiene? ¿Cargas los datos por Ajax o usas alguna otra forma? ¿El intervalo entre la porción de 1k es largo o corto? Lo usas locales recorte de datos? ¿Por qué necesita cargar 10-20k de datos en la cuadrícula? Quiero decir que el usuario no puede leer todos los datos directamente. Así que probablemente quieras mostrar los datos filtrados. ¿No es así? -

Tengo alrededor de 20 columnas. -

¿Qué pasa con otras preguntas?: "¿Cargas los datos por Ajax o usas alguna otra forma?", "¿Usas locales paginación de datos?" y así sucesivamente. ¿Obtiene todos los 10K-20K a la vez del servidor u obtiene los datos realmente en partes de 1K? -

0 Respuestas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.