1

I'd like to have a dojo grid which connects to a server url which outputs the following json : {identifier : "id" items : [ { id: "1", name: "John", university : { name: "XXX", address: "YYY" } }].

Basically I have a nested json. I would like to represent the university name and University address as separate columns in the grid.

I tried using the dojox.grid.DataGrid object and creating a gird layout, but do not know how to refer to the nested elments and university.name and university.address don't seem to work. I am using dojo 1.6.1.

Does anybody have any pointers?

This is the js code I use :

    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();
});

Thanks, Cristian

Helgus
  • 177
  • 3
  • 7
  • 17
cristian.petroaca
  • 355
  • 2
  • 4
  • 13

2 Answers2

3

What kind of store are you using? Have a look at the dojo.data.ItemFileReadStore documentation, there is an example with a situation like yours: http://dojotoolkit.org/reference-guide/dojo/data/ItemFileReadStore.html#item-structure

This would help you fetching all the items with a single call to the method "fetch". If for some reasons it doesn't work due to the different json structure, you can continue using ItemFileReadStore , and create a function that loops over all the objects in your json and uses the loadItem method for adding items one by one in this way (it's not beautiful but it works):

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});
            });
        })
    });
}
perissf
  • 15,979
  • 14
  • 80
  • 117
  • I read that part in the doc and I tried using an ItemFileReadStore with the given json structure from my first post and i doesn't work ( gives a "Sorry, error encountered" in the grid ). My main issue I think is that in the gridlayout I am supposed to give a field value, to map the nested elemets, which I do in the form of "university.name", but I don't think this is the way to map them – cristian.petroaca Aug 05 '11 at 12:59
  • it should work indeed. Can you isolate this part of your code and post it? – perissf Aug 05 '11 at 13:02
  • added it in the opening post. – cristian.petroaca Aug 05 '11 at 13:12
  • Got it. Since there are no working examples available for this situation, I solved a similar one by making a xhrGet and reading the objects one by one, and adding them to the store by using the loadItem method – perissf Aug 05 '11 at 13:37
  • excellent. Pls tick on the left side of my answer so that it goes out of the unanswered lists – perissf Aug 06 '11 at 08:00
  • Thanks! Using an ItemFileWriteStore and simply processing my own results and calling newItem was a great way around this issue. – FanOfTamago Apr 16 '12 at 19:07
2

se a 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 
           }]];
citress
  • 889
  • 3
  • 13
  • 35