2012-05-31 3 views
4

J'ai un problème très spécifique: J'ai une petite forme avec quatre options. Vous pouvez les remplir ou pas, et lorsque vous cliquez sur "OK", je charge un jqGrid avec des données en fonction de ces options. Mais comme je ne sais pas à quoi ressemblent mes colonnes, je laisse ma servlet générer le modèle de colonne et le nom de la colonne; ainsi je dois faire une demande d'AJAX pour charger les données et alors le remplir en jqGrid en tant que données "locales". Je voudrais utiliser la pagination cependant.jqGrid: Charger les données JSON après les données locales déjà dans la table

Ainsi ma question: Comment puis-je charger plus de données dans un jqGrid après qu'il est déjà établi par des données locales?

est ici le code:

$.ajax({ 
    type : 'GET', 
    url : 'data.jsp', 
    data : reqData, 
    dataType : 'json', 
    error: function() { 
     $("#dialog-message").dialog("open"); 
     $("#ajax-loader").css("display", "none"); 
    }, 
    success : function(result) { 
     jQuery("#results").jqGrid({ 
      data : result.rows, 
      datatype : "local", 
      colNames : result.columnNames, 
      colModel : result.columnModel, 
      pager : $('#pager'), 
      rowNum : 1000, 
      scroll : true, 
      viewrecords : true, 
      sortname : 'TITEL', 
      width : window.innerWidth - 30, 
      height : window.innerHeight - 190, 
      altRows : true, 
      loadError: function() { 
       $("#dialog-message").dialog("open"); 
       $("#ajax-loader").css("display", "none"); 
      }, 
      loadComplete: function() { 
       $("#ajax-loader").css("display", "none"); 
      } 
     }).jqGrid("navGrid", "#pager", { 
      edit: false, 
      add: false, 
      del: false, 
      search: true, 
      refresh: false 
     }).jqGrid("gridResize"); 

    } 
}); 

/edit: J'ai essayé de faire ce qui suit, mais cela ne résout pas le problème que la grille ne sait pas combien de pages au total il y a effectivement (en fait, à ce moment-là, je ne sais même pas), et aussi, après chargement, il pense qu'il ne reçoit que des données locales. Y a-t-il peut-être un événement onScroll ou quelque chose? Je n'en ai pas trouvé.

datatype : !json ? "local" : function(postdata) { 
       $.ajax({ 
        type: 'GET', 
        url: 'data.jsp', 
        data: $.merge(postdata, reqData), 
        dataType: 'json', 
        success: function(data, status, jqXHR) { 
         var mygrid = jQuery("#results")[0]; 
         var myjsongrid = eval("("+jqXHR.responseText+")"); 
         mygrid.addJSONData(myjsongrid); 
        } 
       }); 
      }, 
+0

Chargez-vous des données ** all ** dans une requête Ajax ou vous devez ajouter les données à la grille existante? Ne vaut-il pas mieux supprimer l'option 'scroll: true' et utiliser la pagination standard? Si vous ajoutez 'gridview: true', vous pourrez créer rapidement une grille avec plusieurs lignes de données à la fois. Si vous définissez en plus 'rowNum' à la valeur qui correspond le plus à la hauteur de la page dont vous avez besoin, l'utilisateur pourra utiliser pager. – Oleg

+0

Je charge uniquement les 1000 premières lignes des données dans la première requête ajax. Au total, il peut y avoir plus de 80 000 lignes, et la servlet en arrière-plan n'a pas assez de mémoire quand je les charge toutes en même temps (la table a aussi environ 40 colonnes). Même si je supprime 'scroll: true', j'ai toujours le problème que jqGrid ne sait pas combien de pages il y a et donc on ne pourra que choisir la première page. – hugelgupf

+0

Si vous pouvez avoir plus de 80000 lignes, vous pouvez utiliser la pagination standard des données * côté serveur * sans utiliser 'scroll '. Dans le cas, vous devrez charger seulement 20-30 premières lignes de données. Vous pouvez charger 'columnModel' dans une requête Ajax, puis utiliser' datatype: 'json''. Dans le cas jqGrid montrera le nombre de pages et le nombre d'enregistrements dans le pager exactement ce que vous placez dans la réponse du serveur. – Oleg

Répondre

1

Pouvez-vous pas faire quelque chose comme ça ... obtenir la grille, effacer les données, définir l'URL pour obtenir les données de (il peut changer selon l'option de votre utilisateur sélectionné), puis modifiez DATAFORMAT à JSON au lieu de local.

var grid = $('#TargetGridID'); 
    grid.clearGridData(); 
    grid.setGridParam({ url: '../controller/action?datatype=Option1' }); 
    grid.setGridParam({ datatype: 'json' }); 
    grid.trigger('reloadGrid'); 

Nous utilisons cette méthode et il fonctionne très bien ... l'utiliser avec des procédures stockées capables de radiomessagerie et les grilles sont ultra-rapide! Je sais qu'une grille de 20 000 lignes nous prend environ 700 ms avec un nombre de pages de 500 lignes.

Si vous utilisez SQL pour vos données, je peux télécharger un exemple sur la façon de prendre en charge la pagination dans un SQL Stored Proc, très utile.

+0

Merci! Je n'avais pas pensé à ça. Je ne travaille pas dans l'entreprise pour laquelle je faisais ça, donc je n'ai pas besoin de code pour un proc stocké, merci :) – hugelgupf

Questions connexes