2011-07-12 4 views
1

Ok, je suis presque prêt à m'arracher les cheveux. Je charge un jqGrid avec des données JSON mais avec "loadonce" défini sur true, pour le garder local. Quand je montre juste le contenu par défaut des colonnes, le tri fonctionne très bien, mais ce dont j'ai besoin, c'est que certaines colonnes utilisent les informations d'une autre colonne pour modifier ce qui est affiché. Par exemple, au lieu d'avoir une colonne "device" et une colonne "model", je veux afficher les deux sous une colonne, comme ce "device-model", et j'utilise un formateur personnalisé pour cela.Le tri des données locales jqGrid perd de l'information

Le problème est, dans ce cas, lorsque je trier, je perds l'information "modèle" et il devient "indéfini". Voici fait partie de mon code:

mdlTable = tableWrap.jqGrid({ 
    url: loadURL, 
    datatype: 'json', 
    colNames: ['ID', 'Device', 'Description', 'IP', 'Model'], 
    colModel: [ 
     {name:'id', index:'id', hidden:true, key:true}, 
     {name:'device', index:'device', width:192, 
      formatter:function(value, options, rData){ 
       var str = "<a href='/administration/mdl/vwDevice.aspx?device_id="; 
       str += rData[0] + "' target='_blank'>" + value; 
       if ('' != rData[4]) str += " - " + rData[4]; 
       str += "</a>"; 
       return str; 
      } 
     }, 
     {name:'desc', index:'desc', width:256, sortable:false}, 
     {name:'ip', index:'ip', width:96}, 
     {name:'model', index:'model', hidden:true} 
    ], 
    sortname: 'id', 
    viewrecords: true, 
    loadonce: true, 
    viewsortcols: [true,'vertical',true], 
    gridview: true, 
    ignoreCase: true 
}) 
.navGrid('#deviceList_footer', {edit:false, add:false, del:false, cloneToTop:true}); 

Comme vous pouvez le voir, je cache la colonne de modèle, et « déplacer » cette information sur la colonne de l'appareil, car c'est là, il est supposé être montré. Tout va bien en charge, mais dès que je fais le tri, ou que je recherche et rafraîchit la vue, la "copie" des données est perdue pour une raison quelconque. Si je montre la colonne du modèle, l'information reste juste très bien, c'est juste la colonne du périphérique qui obtient la valeur "indéfinie".

J'ai essayé de déclencher "reloadGrid", n'aide pas. J'ai aussi essayé d'ajouter la fonction Unformat mais je ne suis pas sûr de ce que je peux faire là-bas. Je viens juste de retourner un $ (cellobject) .html() - cela ne fonctionnait pas évidemment.

Edit: Ajout d'échantillons de données JSON

{ "rows" : [{ 
     "id" : "181", 
     "cell" : ["181", "Router A", "some description", "55.444.33.222", "Model 1"] 
    }, { 
     "id" : "291", 
     "cell" : ["291", "Router B", "some description", "55.333.22.444", "Model 2"] 
    }, { 
     "id" : "1346", 
     "cell" : ["1346", "Router C", "some description", "55.111.44.333", "Model 3"] 
    }, { 
     "id" : "1999", 
     "cell" : ["1999", "Router D", "some description", "55.222.11.000", "Model 4"] 
    } 
]} 
+0

Pourriez-vous inclure des données JSON de test pouvant être utilisées pour reproduire le problème? – Oleg

+0

Ajout de données de test JSON – ilia

Répondre

7

Le problème est que, au début du troisième paramètre du formatter personnalisé est de type tableau et pas plus tard. Donc, vous devez modifier le formatter à quelque chose comme

formatter: function(value, options, rData){ 
    var model = '', 
     str = "<a href='/administration/mdl/vwDevice.aspx?device_id=" + 
       value + "' target='_blank'>" + value; 
    if ($.isArray(rData)) { 
     model = rData[4]; 
    } else { 
     model = rData.model; 
    } 
    if (model) { 
     str += " - " + model; 
    } 
    str += "</a>"; 
    return str; 
} 

Ensuite, le tri fonctionnera: voir here.

Un conseil de plus. Vous utilisez la propriété key:true de la colonne id. Dans le cas où vous n'avez pas besoin d'inclure les mêmes valeurs id deux fois. Vous pouvez réduire les données JSON au

{ "rows" : [ 
    ["181", "Router A", "some description", "55.444.33.222", "Model 1"], 
    ["291", "Router B", "some description", "55.333.22.444", "Model 2"], 
    ["1346", "Router C", "some description", "55.111.44.333", "Model 3"], 
    ["1999", "Router D", "some description", "55.222.11.000", "Model 4"] 
]} 

suivant Le seul changement dans le jqGrid, pour être en mesure de lire le nouveau format JSON, est paramètre supplémentaire jsonReader: {cell:''}. Voir les résultats here.

+0

Merci! C'est exactement ce dont j'avais besoin. N'a pas réalisé que rData changeait de type après la charge initiale. Et merci pour l'autre conseil aussi. – ilia

+0

@ilia: Vous êtes les bienvenus! – Oleg