10

I'm trying to load 'nested' data in a hasMany relation in ExtJS4. My model looks like this:

Ext.define("Entrypage.model.Entrypage",{
    extend: "Ext.data.Model",
    fields: ['id','title','urlkey','text','picture','keywords', 'searchterms','description','critriamodus'],
    hasMany: {model: 'EntrypageCriterium',name:'brands'},
    proxy: {
        type: 'ajax',
        url:  '/Admin/extjson/entrypages',
        reader: {type:'json', root:'entrypages'}
    }
});

And EntrypageCriterium:

Ext.define("Entrypage.model.EntrypageCriterium",{
    extend: "Ext.data.Model",
    fields: ['id','type','title']
});

I load my data like so:

Entrypage.load("nikon-coolpix",{success:function(record,options,success){
console.log(record);
}});

It loads fine. Json returns this:

{
    "success": true,        
"entrypages":[{
    "id":"1",
    "urlkey":"nikon-coolpix",
    "title":"Nikon Coolpix",
    "text":"Some blahblah about Nikon",
    "keywords":"nikon,coolpix,digitale,camera",
    "description":"Nikon Coolpix camera's",
    "picture":"Nikon Coolpix camera's",
    "searchterms":"nikon coolpix",
    "language":"nl",
    "brands":[
        {"id":27038,"title":"Nikon","type":"brand"}
    ]   
}]
}

But when I try record.brands() or anything like that. It says no such method exists. I think something is going wrong in mapping the data in the model.

Any helpy would be very much appreciated!

Reporter
  • 3,897
  • 5
  • 33
  • 47
Bart Vangeneugden
  • 3,436
  • 4
  • 33
  • 52

2 Answers2

19

Finally found the problem. For any future reference:

If you're using packages in the new MVC structure of ExtJS, define the full path to the linked class in your association like so:

hasMany: {model: 'Entrypage.model.EntrypageCriterium', name: 'brands', associationKey:'brands'}
Bart Vangeneugden
  • 3,436
  • 4
  • 33
  • 52
  • Thank you. I have figured out the same situation myself but it was hard to do. – o_nix Jun 06 '12 at 14:47
  • Was the fix making the model fully qualified? or was the fix actually adding the associationKey? – Tom O. Nov 16 '16 at 19:31
  • Thnx, guys! For me, all this didn't work until I've added `requires: ['Entrypage.model.EntrypageCriterium']` in Entrypage class – JeSa Jul 08 '20 at 11:33
4

You need to set the associationKey property in the hasMany association, so it knows which json property to use.

hasMany: {model: 'EntrypageCriterium',name:'brands', associationKey:'brands'}

see the Loading Nested Data section here:

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.data.reader.Reader

Neil McGuigan
  • 46,580
  • 12
  • 123
  • 152