2011-08-05 7 views
1

Je voudrais avoir une grille de dojo qui se connecte à un serveur url qui sort le json suivant: {identificateur: "id" articles: [{id: "1", nom: "John ", université: {nom:" XXX ", adresse:" YYY "}}].Dojo grid imbriqué json

Fondamentalement, j'ai un json imbriqué. J'aimerais représenter le nom de l'université et l'adresse de l'université en tant que colonnes distinctes dans la grille.

J'ai essayé d'utiliser l'objet dojox.grid.DataGrid et de créer une mise en page gird, mais je ne sais pas comment faire référence aux éléments imbriqués et university.name et university.address ne semblent pas fonctionner. J'utilise dojo 1.6.1.

Est-ce que quelqu'un a des pointeurs?

Ceci est le code js J'utilise:

dojo.require("dojox.grid.DataGrid"); 
    dojo.require("dojo.data.ItemFileReadStore"); 

    dojo.addOnLoad(function(){ 
    // our test data store for this example: 
    var jsonStore = new dojo.data.ItemFileReadStore({ 
     url: '/MainDeployer/ajax/users/get.json' 
    }); 

    var layoutUsers = [ 
     [{ 
       field: "name", 
       name: "Name", 
       width: 10 
      }, 
      { 
       field: "university.name", 
       name: "University Name", 
       width: 10 
      }, 
      { 
       field: "university.address", 
       name: "University Address", 
       width: 'auto' 
      }]]; 

    // create a new grid: 
    var grid = new dojox.grid.DataGrid({ 
     query: {}, 
     store: jsonStore, 
     clientSort: true, 
     rowSelector: '20px', 
     structure: layoutUsers 
    }, 
    document.createElement('div')); 

    dojo.byId("usersTable").appendChild(grid.domNode); 

    grid.startup(); 
}); 

Merci, Cristian

Répondre

3

Quel type de magasin utilisez-vous? Jetez un oeil à la documentation dojo.data.ItemFileReadStore, il y a un exemple avec une situation comme la vôtre: http://dojotoolkit.org/reference-guide/dojo/data/ItemFileReadStore.html#item-structure

Cela vous aidera à aller chercher tous les éléments avec un seul appel à la méthode « chercher ». Si pour certaines raisons cela ne fonctionne pas en raison de la structure différente de json, vous pouvez continuer à utiliser ItemFileReadStore et créer une fonction qui boucle sur tous les objets de votre json et utilise la méthode loadItem pour ajouter des éléments un par un de cette manière. il est pas beau, mais cela fonctionne):

var myData = {"items" : []}; 
var myStore = new dojo.data.ItemFileWriteStore({data: myData}); 
var myLayout = [{ 
    field: 'name', 
    name: 'Name', 
    width: '200px' 
}, 
{ 
field: 'universityName', 
name: 'University Name', 
width: '100px' 
}, 
{ 
field: 'universityAddress', 
name: 'University Address', 
width: '60px' 
}]; 
var myGrid; 

dojo.addOnLoad(function(){ 
    myGrid = new dojox.grid.DataGrid({ 
     store: myStore, 
     structure: myLayout 
    }, document.createElement('div')); 
    dojo.byId("myGridContainer").appendChild(myGrid.domNode); 
    myGrid.startup(); 

    dojo.xhrGet({ 
     url: myURL, 
     handleAs: "json", 
     headers: { 
      "Content-Type": "application/json; charset=uft-8", 
      "Accept" : "application/json" 
     }, 
     load: function(responseObject, ioArgs) { 
      myList = responseObject; 
      dojo.forEach(myList.items, function(element) {  
       myStore.newItem({"name": element.name, 
        "universityName": element.university.name, 
        "universityAddress": element.university.address}); 
      }); 
     }) 
    }); 
} 
+0

je lis cette partie dans le doc et j'ai essayé d'utiliser un ItemFileReadStore avec la structure JSON donnée de mon premier post et je doesn ne fonctionne pas (donne un "Désolé, erreur rencontrée" dans la grille). Mon problème principal, je pense est que dans le gridlayout je suis censé donner une valeur de champ, pour mapper les elemets imbriqués, ce que je fais sous la forme de "university.name", mais je ne pense pas que ce soit le moyen de cartographier eux –

+0

cela devrait fonctionner en effet. Pouvez-vous isoler cette partie de votre code et l'afficher? – perissf

+0

l'a ajouté dans le post d'ouverture. –

2

se un formatter:

var nameFormatter = function(value, rowIdx){ 
     return value.name; 
    }; 
    var addressFormatter = function(value, rowIdx){ 
     return value.address; 
    }; 

    var layoutUsers = [ 
     [{ 
       field: "name", 
       name: "Name", 
       width: 10 
      }, 
      { 
       field: "university", 
       name: "University Name", 
       width: 10, 
       formatter: nameFormatter 
      }, 
      { 
       field: "university", 
       name: "University Address", 
       width: 'auto', 
       formatter: addressFormatter 
      }]];