Created
April 16, 2013 00:33
-
-
Save twasink/5392441 to your computer and use it in GitHub Desktop.
ExtJS has some really nice support out of the box for converting JSON data to model objects. However, it only supports array-based associations, and doesn't support maps/associative arrays. The AssociativeReader - included here, along with two demo models and sample data - provides a way to do that.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* A variant of the JSON reader. Instead of reading arrays, where each record in the array field | |
* has an 'id' property, it reads objects - aka associative arrays. The key of the entry will be the | |
* array. | |
* | |
* So where the JSON reader would like data like this: | |
* [ { id: '1', property: 'foo' }, { id: '2', property: 'bar' } ] | |
* | |
* the associative reader likes data like this: | |
* { '1': { property: 'foo' }, '2': { property: 'bar' } } | |
*/ | |
Ext.define('Twasink.data.AssociativeReader', { | |
extend: 'Ext.data.reader.Json', | |
alias: 'reader.associative', | |
readRecords: function(data) { | |
// convert the associative array into a normal array. | |
var idProperty = 'id'; // should be a config value? | |
var arrayData = [] | |
Ext.Object.each(data, function(key, value) { | |
var arrayEntry = {}; | |
Ext.Object.merge(arrayEntry, value); | |
arrayEntry[idProperty] = key; | |
arrayData.push(arrayEntry); | |
}); | |
return this.callParent( [ arrayData ]); | |
} | |
}) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Ext.define('Twasink.model.Bar', { | |
extend: 'Ext.data.Model', | |
idProperty: 'id', | |
fields: [ 'baz', 'bux'] | |
}) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[ | |
{ "id": "foo_1", "baz": "baz_1", "bux": "bux_1", "bar": { | |
"bar_1": { "baz": "bar_baz_1", "bux": "bar_bux_1" }, | |
"bar_2": { "baz": "bar_baz_2", "bux": "bar_bux_2" } | |
} | |
}, | |
{ "id": "foo_2", "baz": "baz_2", "bux": "bux_2", "bar": { | |
"bar_1": { "baz": "bar_baz_3", "bux": "bar_bux_3" }, | |
"bar_2": { "baz": "bar_baz_4", "bux": "bar_bux_4" } | |
} | |
} | |
] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Ext.define('Twasink.model.Foo', { | |
extend: 'Ext.data.Model', | |
requires: [ 'Twasink.data.AssociativeReader', 'Twasink.model.Bar' ], | |
idProperty: 'id', | |
fields: [ 'baz', 'bux'], | |
hasMany: [ { model: 'Twasink.model.Bar', name: 'bars', associationKey: 'bar', reader: 'associative' }] | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment