PARTY
id
name
getText() - returns name
ORGANIZATION : PARTY
doingBusinessAs
getText() - returns doingBusinessAs
INDIVIDUAL : PARTY
middleName
firstName
birthday
getText() override - returns full name
Handles overridden fields and associations properly. You should use the name property on belongsTo associations if you want to override it.
Here is the override code:
Ext.data.reader.Reader.override({
extractData:function(root){
var me = this,
records = [],
Model = me.model,
length = root.length,
convertedValues, node, record, i;
if (!root.length && Ext.isObject(root)) {
root = [root];
length = 1;
}
for (i = 0; i < length; i++) {
node = root[i];
/* OVERRIDE */
if(me.types){
var typeCode = node[me.typeProperty || 'type'];
var type = me.types[typeCode];
me.model = Ext.ClassManager.get(type); //the model reference is used in other functions
Model = me.model;
me.buildExtractors(true); //need to rebuild the field extractors
}
/* END OVERRIDE */
record = new Model(undefined, me.getId(node), node, convertedValues = {});
record.phantom = false;
me.convertRecordData(convertedValues, node, record);
records.push(record);
if (me.implicitIncludes) {
me.readAssociated(record, node);
}
}
return records;
}
});
//Here is how you would use it:
Ext.define('My.model.Party', {
extend:'Ext.data.Model',
requires:[
'My.model.Individual',
'My.model.Organization'
],
fields:[
'id',
'type',
'name',
{
name:'text',
mapping:'name'
}
],
proxy:{
type:'ajax',
url:'parties',
reader: {
root:'parties',
types:{
'i':'My.model.Individual',
'o':'My.model.Organization'
}
}
}
});
// the json:
{
success: true,
parties:[
{ id:4, type:'i', name:'chief', firstName:'el', middleName:'_', birthday:'May 1' },
{ id:99, type:'o', name:'Sencha, Inc.', doingBusinessAs:'Sencha' }
]
}
Your Parties store would then contain an Individual object and an Organization object.
Peace.
Great post Neil! I'm a big party model fan. Just a few questions
ReplyDelete1. Was there a reason you chose not to ship down the 'subclass' type in the response as a property and simply configure the reader to interrogate said property? e.g. ... reader { root:'partyies' typeProperty: 'subtype'}...
2. Does this scheme handle associations (HasMany, HasOne, etc) at the base class level and subclass level?
1. Nope, there was no good reason :) Good idea, I will use that instead.
Delete2. It handled subclassing fields and associations properly in my tests. I tested hasMany and belongsTo. Works in parent and child models. The only issue was I had to set the name property of belognsTo associations in order for them to be override-able.