123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The source code</title>
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
- <style type="text/css">
- .highlight { display: block; background-color: #ddd; }
- </style>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js"><span id='Ext-data-association-Association'>/**
- </span> * @author Ed Spencer
- *
- * Associations enable you to express relationships between different {@link Ext.data.Model Models}. Let's say we're
- * writing an ecommerce system where Users can make Orders - there's a relationship between these Models that we can
- * express like this:
- *
- * Ext.define('User', {
- * extend: 'Ext.data.Model',
- * fields: ['id', 'name', 'email'],
- *
- * hasMany: {model: 'Order', name: 'orders'}
- * });
- *
- * Ext.define('Order', {
- * extend: 'Ext.data.Model',
- * fields: ['id', 'user_id', 'status', 'price'],
- *
- * belongsTo: 'User'
- * });
- *
- * We've set up two models - User and Order - and told them about each other. You can set up as many associations on
- * each Model as you need using the two default types - {@link Ext.data.HasManyAssociation hasMany} and {@link
- * Ext.data.BelongsToAssociation belongsTo}. There's much more detail on the usage of each of those inside their
- * documentation pages. If you're not familiar with Models already, {@link Ext.data.Model there is plenty on those too}.
- *
- * **Further Reading**
- *
- * - {@link Ext.data.association.HasMany hasMany associations}
- * - {@link Ext.data.association.BelongsTo belongsTo associations}
- * - {@link Ext.data.association.HasOne hasOne associations}
- * - {@link Ext.data.Model using Models}
- *
- * # Self association models
- *
- * We can also have models that create parent/child associations between the same type. Below is an example, where
- * groups can be nested inside other groups:
- *
- * // Server Data
- * {
- * "groups": {
- * "id": 10,
- * "parent_id": 100,
- * "name": "Main Group",
- * "parent_group": {
- * "id": 100,
- * "parent_id": null,
- * "name": "Parent Group"
- * },
- * "child_groups": [{
- * "id": 2,
- * "parent_id": 10,
- * "name": "Child Group 1"
- * },{
- * "id": 3,
- * "parent_id": 10,
- * "name": "Child Group 2"
- * },{
- * "id": 4,
- * "parent_id": 10,
- * "name": "Child Group 3"
- * }]
- * }
- * }
- *
- * // Client code
- * Ext.define('Group', {
- * extend: 'Ext.data.Model',
- * fields: ['id', 'parent_id', 'name'],
- * proxy: {
- * type: 'ajax',
- * url: 'data.json',
- * reader: {
- * type: 'json',
- * root: 'groups'
- * }
- * },
- * associations: [{
- * type: 'hasMany',
- * model: 'Group',
- * primaryKey: 'id',
- * foreignKey: 'parent_id',
- * autoLoad: true,
- * associationKey: 'child_groups' // read child data from child_groups
- * }, {
- * type: 'belongsTo',
- * model: 'Group',
- * primaryKey: 'id',
- * foreignKey: 'parent_id',
- * associationKey: 'parent_group' // read parent data from parent_group
- * }]
- * });
- *
- * Ext.onReady(function(){
- *
- * Group.load(10, {
- * success: function(group){
- * console.log(group.getGroup().get('name'));
- *
- * group.groups().each(function(rec){
- * console.log(rec.get('name'));
- * });
- * }
- * });
- *
- * });
- *
- */
- Ext.define('Ext.data.association.Association', {
- alternateClassName: 'Ext.data.Association',
- <span id='Ext-data-association-Association-cfg-ownerModel'> /**
- </span> * @cfg {String} ownerModel
- * The string name of the model that owns the association.
- *
- * **NB!** This config is required when instantiating the Association directly.
- * However, it cannot be used at all when defining the association as a config
- * object inside Model, because the name of the model itself will be supplied
- * automatically as the value of this config.
- */
- <span id='Ext-data-association-Association-cfg-associatedModel'> /**
- </span> * @cfg {String} associatedModel
- * The string name of the model that is being associated with.
- *
- * **NB!** This config is required when instantiating the Association directly.
- * When defining the association as a config object inside Model, the #model
- * configuration will shadow this config.
- */
- <span id='Ext-data-association-Association-cfg-model'> /**
- </span> * @cfg {String} model
- * The string name of the model that is being associated with.
- *
- * This config option is to be used when defining the association as a config
- * object within Model. The value is then mapped to #associatedModel when
- * Association is instantiated inside Model.
- */
- <span id='Ext-data-association-Association-cfg-primaryKey'> /**
- </span> * @cfg {String} primaryKey
- * The name of the primary key on the associated model. In general this will be the
- * {@link Ext.data.Model#idProperty} of the Model.
- */
- primaryKey: 'id',
- <span id='Ext-data-association-Association-cfg-reader'> /**
- </span> * @cfg {Ext.data.reader.Reader} reader
- * A special reader to read associated data
- */
-
- <span id='Ext-data-association-Association-cfg-associationKey'> /**
- </span> * @cfg {String} associationKey
- * The name of the property in the data to read the association from. Defaults to the name of the associated model.
- */
- defaultReaderType: 'json',
- isAssociation: true,
- initialConfig: null,
- statics: {
- AUTO_ID: 1000,
-
- create: function(association){
- if (Ext.isString(association)) {
- association = {
- type: association
- };
- }
- switch (association.type) {
- case 'belongsTo':
- return new Ext.data.association.BelongsTo(association);
- case 'hasMany':
- return new Ext.data.association.HasMany(association);
- case 'hasOne':
- return new Ext.data.association.HasOne(association);
- //TODO Add this back when it's fixed
- // case 'polymorphic':
- // return Ext.create('Ext.data.PolymorphicAssociation', association);
- default:
- //<debug>
- Ext.Error.raise('Unknown Association type: "' + association.type + '"');
- //</debug>
- }
- return association;
- }
- },
- <span id='Ext-data-association-Association-method-constructor'> /**
- </span> * Creates the Association object.
- * @param {Object} [config] Config object.
- */
- constructor: function(config) {
- Ext.apply(this, config);
- var me = this,
- types = Ext.ModelManager.types,
- ownerName = config.ownerModel,
- associatedName = config.associatedModel,
- ownerModel = types[ownerName],
- associatedModel = types[associatedName];
- me.initialConfig = config;
- //<debug>
- if (ownerModel === undefined) {
- Ext.Error.raise("The configured ownerModel was not valid (you tried " + ownerName + ")");
- }
- if (associatedModel === undefined) {
- Ext.Error.raise("The configured associatedModel was not valid (you tried " + associatedName + ")");
- }
- //</debug>
- me.ownerModel = ownerModel;
- me.associatedModel = associatedModel;
- <span id='Ext-data-association-Association-property-ownerName'> /**
- </span> * @property {String} ownerName
- * The name of the model that 'owns' the association
- */
- <span id='Ext-data-association-Association-property-associatedName'> /**
- </span> * @property {String} associatedName
- * The name of the model is on the other end of the association (e.g. if a User model hasMany Orders, this is
- * 'Order')
- */
- Ext.applyIf(me, {
- ownerName : ownerName,
- associatedName: associatedName
- });
-
- me.associationId = 'association' + (++me.statics().AUTO_ID);
- },
- <span id='Ext-data-association-Association-method-getReader'> /**
- </span> * Get a specialized reader for reading associated data
- * @return {Ext.data.reader.Reader} The reader, null if not supplied
- */
- getReader: function(){
- var me = this,
- reader = me.reader,
- model = me.associatedModel;
- if (reader) {
- if (Ext.isString(reader)) {
- reader = {
- type: reader
- };
- }
- if (reader.isReader) {
- reader.setModel(model);
- } else {
- Ext.applyIf(reader, {
- model: model,
- type : me.defaultReaderType
- });
- }
- me.reader = Ext.createByAlias('reader.' + reader.type, reader);
- }
- return me.reader || null;
- }
- });
- </pre>
- </body>
- </html>
|