2010-06-05 4 views
23

Je suis en train d'utiliser jqGrid avec des données locales et je trouve quelques questions:jqGrid Rafraîchissant données locales (objet JSON)

J'initialiser la chose comme ceci:

function refreshGrid($grid, results) 
{ 
    $grid.jqGrid({ 
    data: results, 
     datatype: "local", 
     colNames:['#','File', 'Category', 'Line Number', 'Message Text','Detailed'], 
     colModel:[ 
      {name:'count',index:'count', width:100, resizable: true}, 
      {name:'basename',index:'basename', width:100, resizable: true, classes:['basename']}, 
      {name:'category',index:'category', width:60, resizable: true}, 
      {name:'linenumber',index:'linenumber', width:60, resizable: true}, 
      {name:'text',index:'text',width:400, resizable: true}, 
      {name:'detailed',index:'detailed',width:100,classes:['detailed'], resizable: true } 
      ], 
     viewrecords: true, 
    rowNum:100, 
    rowList:[100,200], 
    pager: '#debug_errors_pager', 
    caption:"JSON Example" 
}); 
} 

Les données que je transmets, results, sont un tableau d'objets.

Questions:

1) Le téléavertisseur est totalement hors. Il montre le nombre correct, mais il ne me laisse pas réellement parcourir les données.

2) Je ne peux pas actualiser les données. J'utilise ma propre fonction de recherche pour arriver à mon results. Je n'arrive pas à comprendre comment mettre à jour les données existantes. La grille s'initialise la première fois. Lors des tentatives suivantes, il s'initialise à une table vide.

3) J'ai essayé des choses comme:

$grid.empty() - ne fonctionne pas parce que l'objet de la grille $ est décorée par jqGrid. J'essaye de "nuke" la vieille grille et la rends simplement comme une solution de contournement. `$ grid.trigger ('reloadGrid') - Ne fonctionne pas, ne sait pas pourquoi.

Note: ceci utilise jQGrid 3.7.

Répondre

7

question 1:

Si nous avons défini un téléavertisseur pour la grille avec des données côté client, les boutons téléavertisseur sont automatiquement désactivées. En d'autres termes, la version actuelle de la grille ne prend pas en charge la pagination et la recherche côté client.

local data

Question 2: Avez-vous essayé:

$("#list").GridUnload(); 

voir here les différences entre gridUnload() et trigger('reloadGrid').

+2

Oui, j'ai essayé GridUnload, Pas de dés. La grille se décharge et ne revient jamais. – Koobz

+0

Est-il possible que vos 'résultats' proviennent d'une requête ajax, et quand vous 'déchargez' et rechargez votre jqGrid, les résultats ne sont pas encore chargés? Donc, la grille sera vide? (c'est la seule chose que je peux imaginer qui peut être faux) – bruno

6

Je n'ai pas trouvé un bon documenté façon de mettre à jour les données locales de jqGrid, voici comment j'ai étendu jqGrid pour résoudre mon problème:

$.extend($.fn.jqGrid, { setData: function(data) { 
    this[0].p.data = data; 
    return true; 
} }); 

Après cela, vous pouvez faire ce qui suit pour mettre à jour jqGrid avec de nouvelles données:

supposons que votre grille a été déclarée comme ceci:

jQuery("#list").jqGrid({ datatype: "local", ... other params ... }); 

alors vous pouvez faire:

jQuery("#list").jqGrid('setData', array_with_new_data); 
jQuery("#list").trigger("reloadGrid"); 

P.S.voir le lien sur la façon de récupérer toutes les données de la grille Retrieving contents of the grid

31

Vous pouvez utiliser simple:

jQuery("#list") 
    .jqGrid('setGridParam', 
     { 
      datatype: 'local', 
      data:mydata 
     }) 
    .trigger("reloadGrid"); 
5

Après des œuvres pour moi quand le rafraîchissement des données sur un réseau existant:

var gridData = [...]; 

var grid = jQuery('#gridId'); 
grid.jqGrid('clearGridData'); 
if(grid.get(0).p.treeGrid) { 
    grid.get(0).addJSONData({ 
     total: 1, 
     page: 1, 
     records: gridData.length, 
     rows: gridData 
    }); 
} 
else { 
    grid.jqGrid('setGridParam', { 
     datatype: 'local', 
     data: gridData, 
     rowNum: gridData.length 
    }); 
} 
grid.trigger('reloadGrid'); 

moi avions Pour cela, car reloadGrid() appelle populate(), populate() appelle addLocalData() et passe la valeur de retour à addJSONData(), mais pour treeGrid == true, addLocalData() ne renvoie rien, et addJSONData() fait ensuite rien.

22

J'ai été capable de réaliser quelque chose de similaire. L'astuce pour mon problème était d'effacer les données avant de mettre à jour le paramètre de grille de données. En supposant que votre grille est initialisée ailleurs (avec le type de données 'local'), essayez:

function refreshGrid($grid, results) { 
    $grid.jqGrid('clearGridData') 
     .jqGrid('setGridParam', { data: results }) 
     .trigger('reloadGrid', [{ page: 1}]); 
} 
+2

en plus si besoin d'éviter le changement de page (si possible) pour de nouvelles données (donc l'utilisateur restera sur la même page après rechargement) quelque chose comme ça devrait être utilisé code 'var prevPage = $ grid.jqGrid (" getGridParam ", 'page'); var rowNum = parseInt ($ grid.jqGrid ("getGridParam", "rowNum"), 10); var DernièrePage = Math.ceil (newData.length/rowNum); grid.jqGrid $ ('clearGridData') .jqGrid ('setGridParam', {data: newData}) .jqGrid ('setGridParam', {lastpage: lastPage}) .trigger ('reloadGrid', [{page : prevPage}]); ' –

+0

+1 pour effacer les données, a également eu le problème – TecHunter

+0

Merci beaucoup pour ('clearGridData')! – dellgg