Ext.data.association.HasOne

Alternate names

Ext.data.HasOneAssociation

Hierarchy

Ext.Base
Ext.data.association.Association
Ext.data.association.HasOne

Files

Represents a one to one association with another model. The owner model is expected to have a foreign key which references the primary key of the associated model:

Ext.define('Person', {
    extend: 'Ext.data.Model',
    config: {
        fields: [
            { name: 'id', type: 'int' },
            { name: 'name', type: 'string' },
            { name: 'address_id', type: 'int'}
        ],

        // we can use the hasOne shortcut on the model to create a hasOne association
        associations: { type: 'hasOne', model: 'Address' }
    }
});

Ext.define('Address', {
    extend: 'Ext.data.Model',
    config: {
        fields: [
            { name: 'id', type: 'int' },
            { name: 'number', type: 'string' },
            { name: 'street', type: 'string' },
            { name: 'city', type: 'string' },
            { name: 'zip', type: 'string' }
        ]
    }
});

In the example above we have created models for People and Addresses, and linked them together by saying that each Person has a single Address. This automatically links each Person to an Address based on the Persons address_id, and provides new functions on the Person model:

Generated getter function

The first function that is added to the owner model is a getter function:

var person = Ext.create('Person', {
    id: 100,
    address_id: 20,
    name: 'John Smith'
});

person.getAddress(function(address, operation) {
    // do something with the address object
    alert(address.get('id')); // alerts 20
}, this);

The getAddress function was created on the Person model when we defined the association. This uses the Persons configured proxy to load the Address asynchronously, calling the provided callback when it has loaded.

The new getAddress function will also accept an object containing success, failure and callback properties - callback will always be called, success will only be called if the associated model was loaded successfully and failure will only be called if the associated model could not be loaded:

person.getAddress({
    reload: true, // force a reload if the owner model is already cached
    callback: function(address, operation) {}, // a function that will always be called
    success : function(address, operation) {}, // a function that will only be called if the load succeeded
    failure : function(address, operation) {}, // a function that will only be called if the load did not succeed
    scope   : this // optionally pass in a scope object to execute the callbacks in
});

In each case above the callbacks are called with two arguments - the associated model instance and the operation object that was executed to load that instance. The Operation object is useful when the instance could not be loaded.

Once the getter has been called on the model, it will be cached if the getter is called a second time. To force the model to reload, specify reload: true in the options object.

Generated setter function

The second generated function sets the associated model instance - if only a single argument is passed to the setter then the following two calls are identical:

// this call...
person.setAddress(10);

// is equivalent to this call:
person.set('address_id', 10);

An instance of the owner model can also be passed as a parameter.

If we pass in a second argument, the model will be automatically saved and the second argument passed to the owner model's save method:

person.setAddress(10, function(address, operation) {
    // the address has been saved
    alert(address.get('address_id')); //now alerts 10
});

//alternative syntax:
person.setAddress(10, {
    callback: function(address, operation) {}, // a function that will always be called
    success : function(address, operation) {}, // a function that will only be called if the load succeeded
    failure : function(address, operation) {}, // a function that will only be called if the load did not succeed
    scope   : this //optionally pass in a scope object to execute the callbacks in
});

Customization

Associations reflect on the models they are linking to automatically set up properties such as the primaryKey and foreignKey. These can alternatively be specified:

Ext.define('Person', {
    extend: 'Ext.data.Model',
    config: {
        fields: [
            // ...
        ],

        associations: [
            { type: 'hasOne', model: 'Address', primaryKey: 'unique_id', foreignKey: 'addr_id' }
        ]
    }
});

Here we replaced the default primary key (defaults to 'id') and foreign key (calculated as 'address_id') with our own settings. Usually this will not be needed.

Config options

Defined By

Required config options

The full class name or reference to the class that the ownerModel is being associated with. ...

The full class name or reference to the class that the ownerModel is being associated with. This is a required configuration on every association.

The full class name or reference to the class that owns this associations. ...

The full class name or reference to the class that owns this associations. This is a required configuration on every association.

Defined By

Optional config options

The name for the associated model. ...

The name for the associated model. This defaults to the last part of the class name of the associatedModel.

The name of the property in the data to read the association from. ...

The name of the property in the data to read the association from. Defaults to the associatedName plus '_id'.

Ext.data.association.HasOne
view source
: String
The name of the foreign key on the owner model that links it to the associated model. ...

The name of the foreign key on the owner model that links it to the associated model. Defaults to the lowercased name of the associated model plus "_id", e.g. an association with a model called Person would set up a address_id foreign key.

Ext.define('Person', {
    extend: 'Ext.data.Model',
    fields: ['id', 'name', 'address_id'], // refers to the id of the address object
    hasOne: 'Address'
});

Ext.define('Address', {
    extend: 'Ext.data.Model',
    fields: ['id', 'number', 'street', 'city', 'zip'],
    belongsTo: 'Person'
});
var Person = new Person({
    id: 1,
    name: 'John Smith',
    address_id: 13
}, 1);
person.getAddress(); // Will make a call to the server asking for address_id 13
Ext.data.association.HasOne
view source
: String
The name of the getter function that will be added to the local model's prototype. ...

The name of the getter function that will be added to the local model's prototype. Defaults to 'get' + the name of the foreign model, e.g. getAddress

Ext.data.association.HasOne
view source
: Objectprivate
The name for the owner model. ...

The name for the owner model. This defaults to the last part of the class name of the ownerModel.

The name of the primary key on the associated model. ...

The name of the primary key on the associated model. In general this will be the Ext.data.Model.idProperty of the Model.

Defaults to: 'id'

A special reader to read associated data.

A special reader to read associated data.

Ext.data.association.HasOne
view source
: String
The name of the setter function that will be added to the local model's prototype. ...

The name of the setter function that will be added to the local model's prototype. Defaults to 'set' + the name of the foreign model, e.g. setAddress

The type configuration can be used when creating associations using a configuration object. ...

The type configuration can be used when creating associations using a configuration object. Use hasMany to create a HasMany association.

associations: [{
    type: 'hasMany',
    model: 'User'
}]

Properties

Defined By

Instance properties

Get the reference to the current class from which this object was instantiated. ...

Get the reference to the current class from which this object was instantiated. Unlike statics, this.self is scope-dependent and it's meant to be used for dynamic inheritance. See statics for a detailed comparison

Ext.define('My.Cat', {
    statics: {
        speciesName: 'Cat' // My.Cat.speciesName = 'Cat'
    },

    constructor: function() {
        alert(this.self.speciesName); // dependent on 'this'
    },

    clone: function() {
        return new this.self();
    }
});


Ext.define('My.SnowLeopard', {
    extend: 'My.Cat',
    statics: {
        speciesName: 'Snow Leopard'         // My.SnowLeopard.speciesName = 'Snow Leopard'
    }
});

var cat = new My.Cat();                     // alerts 'Cat'
var snowLeopard = new My.SnowLeopard();     // alerts 'Snow Leopard'

var clone = snowLeopard.clone();
alert(Ext.getClassName(clone));             // alerts 'My.SnowLeopard'
Defined By

Static properties

...

Defaults to: []

Methods

Defined By

Instance methods

Creates the Association object. ...

Creates the Association object.

Parameters

  • config : Object (optional)

    Config object.

Returns

Fires

    ...

    Parameters

    ...

    Parameters

    Fires

      Ext.data.association.HasOne
      view source
      ( associationKey )private
      ...

      Parameters

      Fires

        Ext.data.association.HasOne
        view source
        ( foreignKey )private
        ...

        Parameters

        Fires

          Ext.data.association.HasOne
          view source
          ( getterName )private
          ...

          Parameters

          Fires

            Ext.data.association.HasOne
            view source
            ( instanceName )private
            ...

            Parameters

            Fires

              ...

              Parameters

              Fires

                ...

                Parameters

                ...

                Parameters

                Fires

                  ...

                  Parameters

                  Fires

                    Ext.data.association.HasOne
                    view source
                    ( setterName )private
                    ...

                    Parameters

                    Fires

                      Call the original method that was previously overridden with override, This method is deprecated as callParent does ...

                      Call the original method that was previously overridden with override,

                      This method is deprecated as callParent does the same thing.

                      Ext.define('My.Cat', {
                          constructor: function() {
                              alert("I'm a cat!");
                          }
                      });
                      
                      My.Cat.override({
                          constructor: function() {
                              alert("I'm going to be a cat!");
                      
                              var instance = this.callOverridden();
                      
                              alert("Meeeeoooowwww");
                      
                              return instance;
                          }
                      });
                      
                      var kitty = new My.Cat(); // alerts "I'm going to be a cat!"
                                                // alerts "I'm a cat!"
                                                // alerts "Meeeeoooowwww"
                      

                      Parameters

                      • args : Array/Arguments

                        The arguments, either an array or the arguments object from the current method, for example: this.callOverridden(arguments)

                      Returns

                      • Object

                        Returns the result of calling the overridden method

                      Call the "parent" method of the current method. ...

                      Call the "parent" method of the current method. That is the method previously overridden by derivation or by an override (see Ext.define).

                       Ext.define('My.Base', {
                           constructor: function (x) {
                               this.x = x;
                           },
                      
                           statics: {
                               method: function (x) {
                                   return x;
                               }
                           }
                       });
                      
                       Ext.define('My.Derived', {
                           extend: 'My.Base',
                      
                           constructor: function () {
                               this.callParent([21]);
                           }
                       });
                      
                       var obj = new My.Derived();
                      
                       alert(obj.x);  // alerts 21
                      

                      This can be used with an override as follows:

                       Ext.define('My.DerivedOverride', {
                           override: 'My.Derived',
                      
                           constructor: function (x) {
                               this.callParent([x*2]); // calls original My.Derived constructor
                           }
                       });
                      
                       var obj = new My.Derived();
                      
                       alert(obj.x);  // now alerts 42
                      

                      This also works with static methods.

                       Ext.define('My.Derived2', {
                           extend: 'My.Base',
                      
                           statics: {
                               method: function (x) {
                                   return this.callParent([x*2]); // calls My.Base.method
                               }
                           }
                       });
                      
                       alert(My.Base.method(10));     // alerts 10
                       alert(My.Derived2.method(10)); // alerts 20
                      

                      Lastly, it also works with overridden static methods.

                       Ext.define('My.Derived2Override', {
                           override: 'My.Derived2',
                      
                           statics: {
                               method: function (x) {
                                   return this.callParent([x*2]); // calls My.Derived2.method
                               }
                           }
                       });
                      
                       alert(My.Derived2.method(10)); // now alerts 40
                      

                      To override a method and replace it and also call the superclass method, use callSuper. This is often done to patch a method to fix a bug.

                      Parameters

                      • args : Array/Arguments

                        The arguments, either an array or the arguments object from the current method, for example: this.callParent(arguments)

                      Returns

                      • Object

                        Returns the result of calling the parent method

                      This method is used by an override to call the superclass method but bypass any overridden method. ...

                      This method is used by an override to call the superclass method but bypass any overridden method. This is often done to "patch" a method that contains a bug but for whatever reason cannot be fixed directly.

                      Consider:

                       Ext.define('Ext.some.Class', {
                           method: function () {
                               console.log('Good');
                           }
                       });
                      
                       Ext.define('Ext.some.DerivedClass', {
                           method: function () {
                               console.log('Bad');
                      
                               // ... logic but with a bug ...
                      
                               this.callParent();
                           }
                       });
                      

                      To patch the bug in DerivedClass.method, the typical solution is to create an override:

                       Ext.define('App.paches.DerivedClass', {
                           override: 'Ext.some.DerivedClass',
                      
                           method: function () {
                               console.log('Fixed');
                      
                               // ... logic but with bug fixed ...
                      
                               this.callSuper();
                           }
                       });
                      

                      The patch method cannot use callParent to call the superclass method since that would call the overridden method containing the bug. In other words, the above patch would only produce "Fixed" then "Good" in the console log, whereas, using callParent would produce "Fixed" then "Bad" then "Good".

                      Parameters

                      • args : Array/Arguments

                        The arguments, either an array or the arguments object from the current method, for example: this.callSuper(arguments)

                      Returns

                      • Object

                        Returns the result of calling the superclass method

                      Ext.data.association.HasOne
                      view source
                      ( ) : Functionprivate
                      Returns a getter function to be placed on the owner model's prototype. ...

                      Returns a getter function to be placed on the owner model's prototype. We cache the loaded instance the first time it is loaded so that subsequent calls to the getter always receive the same reference.

                      Returns

                      Fires

                        Ext.data.association.HasOne
                        view source
                        ( ) : Functionprivate
                        Returns a setter function to be placed on the owner model's prototype ...

                        Returns a setter function to be placed on the owner model's prototype

                        Returns

                        Fires

                          Returns the value of associatedModel. ...

                          Returns the value of associatedModel.

                          Returns

                          Returns the value of associatedName. ...

                          Returns the value of associatedName.

                          Returns

                          Returns the value of associationKey. ...

                          Returns the value of associationKey.

                          Returns

                          ...

                          Parameters

                          Ext.data.association.HasOne
                          view source
                          ( ) : String
                          Returns the value of foreignKey. ...

                          Returns the value of foreignKey.

                          Returns

                          Ext.data.association.HasOne
                          view source
                          ( ) : String
                          Returns the value of getterName. ...

                          Returns the value of getterName.

                          Returns

                          Returns the initial configuration passed to constructor. ...

                          Returns the initial configuration passed to constructor.

                          Parameters

                          • name : String (optional)

                            When supplied, value for particular configuration option is returned, otherwise the full config object is returned.

                          Returns

                          Ext.data.association.HasOne
                          view source
                          ( ) : Object
                          Returns the value of instanceName. ...

                          Returns the value of instanceName.

                          Returns

                          Ext.data.association.HasOne
                          view source
                          ( )private
                          ...

                          Fires

                            Returns the value of name. ...

                            Returns the value of name.

                            Returns

                            Returns the value of ownerModel. ...

                            Returns the value of ownerModel.

                            Returns

                            Returns the value of ownerName. ...

                            Returns the value of ownerName.

                            Returns

                            Returns the value of primaryKey. ...

                            Returns the value of primaryKey.

                            Returns

                            Returns the value of reader. ...

                            Returns the value of reader.

                            Returns

                            Ext.data.association.HasOne
                            view source
                            ( ) : String
                            Returns the value of setterName. ...

                            Returns the value of setterName.

                            Returns

                            Returns the value of type. ...

                            Returns the value of type.

                            Returns

                            ...

                            Parameters

                            ( instanceConfig ) : Objectchainableprotected
                            Initialize configuration for this class. ...

                            Initialize configuration for this class. a typical example:

                            Ext.define('My.awesome.Class', {
                                // The default config
                                config: {
                                    name: 'Awesome',
                                    isAwesome: true
                                },
                            
                                constructor: function(config) {
                                    this.initConfig(config);
                                }
                            });
                            
                            var awesome = new My.awesome.Class({
                                name: 'Super Awesome'
                            });
                            
                            alert(awesome.getName()); // 'Super Awesome'
                            

                            Parameters

                            Returns

                            • Object

                              mixins The mixin prototypes as key - value pairs

                            Fires

                              Convert old properties in data into a config object ...

                              Convert old properties in data into a config object

                              Parameters

                              ( names, callback, scope )private
                              ...

                              Parameters

                              Ext.data.association.HasOne
                              view source
                              ( record, reader, associationData )private
                              Read associated data ...

                              Read associated data

                              Parameters

                              Fires

                                Sets the value of associatedModel. ...

                                Sets the value of associatedModel.

                                Parameters

                                Sets the value of associatedName. ...

                                Sets the value of associatedName.

                                Parameters

                                Sets the value of associationKey. ...

                                Sets the value of associationKey.

                                Parameters

                                ( config, applyIfNotSet ) : Ext.Basechainableprivate
                                ...

                                Parameters

                                Returns

                                Ext.data.association.HasOne
                                view source
                                ( foreignKey )
                                Sets the value of foreignKey. ...

                                Sets the value of foreignKey.

                                Parameters

                                Ext.data.association.HasOne
                                view source
                                ( getterName )
                                Sets the value of getterName. ...

                                Sets the value of getterName.

                                Parameters

                                Ext.data.association.HasOne
                                view source
                                ( instanceName )
                                Sets the value of instanceName. ...

                                Sets the value of instanceName.

                                Parameters

                                Sets the value of name. ...

                                Sets the value of name.

                                Parameters

                                Sets the value of ownerModel. ...

                                Sets the value of ownerModel.

                                Parameters

                                Sets the value of ownerName. ...

                                Sets the value of ownerName.

                                Parameters

                                Sets the value of primaryKey. ...

                                Sets the value of primaryKey.

                                Parameters

                                Sets the value of reader. ...

                                Sets the value of reader.

                                Parameters

                                Ext.data.association.HasOne
                                view source
                                ( setterName )
                                Sets the value of setterName. ...

                                Sets the value of setterName.

                                Parameters

                                Sets the value of type. ...

                                Sets the value of type.

                                Parameters

                                Get the reference to the class from which this object was instantiated. ...

                                Get the reference to the class from which this object was instantiated. Note that unlike self, this.statics() is scope-independent and it always returns the class from which it was called, regardless of what this points to during run-time

                                Ext.define('My.Cat', {
                                    statics: {
                                        totalCreated: 0,
                                        speciesName: 'Cat' // My.Cat.speciesName = 'Cat'
                                    },
                                
                                    constructor: function() {
                                        var statics = this.statics();
                                
                                        alert(statics.speciesName);     // always equals to 'Cat' no matter what 'this' refers to
                                                                        // equivalent to: My.Cat.speciesName
                                
                                        alert(this.self.speciesName);   // dependent on 'this'
                                
                                        statics.totalCreated++;
                                    },
                                
                                    clone: function() {
                                        var cloned = new this.self();                    // dependent on 'this'
                                
                                        cloned.groupName = this.statics().speciesName;   // equivalent to: My.Cat.speciesName
                                
                                        return cloned;
                                    }
                                });
                                
                                
                                Ext.define('My.SnowLeopard', {
                                    extend: 'My.Cat',
                                
                                    statics: {
                                        speciesName: 'Snow Leopard'     // My.SnowLeopard.speciesName = 'Snow Leopard'
                                    },
                                
                                    constructor: function() {
                                        this.callParent();
                                    }
                                });
                                
                                var cat = new My.Cat();                 // alerts 'Cat', then alerts 'Cat'
                                
                                var snowLeopard = new My.SnowLeopard(); // alerts 'Cat', then alerts 'Snow Leopard'
                                
                                var clone = snowLeopard.clone();
                                alert(Ext.getClassName(clone));         // alerts 'My.SnowLeopard'
                                alert(clone.groupName);                 // alerts 'Cat'
                                
                                alert(My.Cat.totalCreated);             // alerts 3
                                

                                Returns

                                ( associatedModel, oldAssociatedModel )private
                                ...

                                Parameters

                                Fires

                                  Ext.data.association.HasOne
                                  view source
                                  ( foreignKey, oldForeignKey )private
                                  ...

                                  Parameters

                                  Fires

                                    Ext.data.association.HasOne
                                    view source
                                    ( getterName, oldGetterName )private
                                    ...

                                    Parameters

                                    Fires

                                      ...

                                      Parameters

                                      Fires

                                        ...

                                        Parameters

                                        Fires

                                          Ext.data.association.HasOne
                                          view source
                                          ( setterName, oldSetterName )private
                                          ...

                                          Parameters

                                          Fires

                                            Defined By

                                            Static methods

                                            ( config, fullMerge )privatestatic
                                            ...

                                            Parameters

                                            ( members )chainableprivatestatic
                                            ...

                                            Parameters

                                            ( name, member )chainableprivatestatic
                                            ...

                                            Parameters

                                            ( members )chainablestatic
                                            Add methods / properties to the prototype of this class. ...

                                            Add methods / properties to the prototype of this class.

                                            Ext.define('My.awesome.Cat', {
                                                constructor: function() {
                                                    // ...
                                                }
                                            });
                                            
                                             My.awesome.Cat.addMembers({
                                                 meow: function() {
                                                    alert('Meowww...');
                                                 }
                                             });
                                            
                                             var kitty = new My.awesome.Cat();
                                             kitty.meow();
                                            

                                            Parameters

                                            ( members ) : Ext.Basechainablestatic
                                            Add / override static properties of this class. ...

                                            Add / override static properties of this class.

                                            Ext.define('My.cool.Class', {
                                                // this.se
                                            });
                                            
                                            My.cool.Class.addStatics({
                                                someProperty: 'someValue',      // My.cool.Class.someProperty = 'someValue'
                                                method1: function() {  },    // My.cool.Class.method1 = function() { ... };
                                                method2: function() {  }     // My.cool.Class.method2 = function() { ... };
                                            });
                                            

                                            Parameters

                                            Returns

                                            ( xtype )chainableprivatestatic
                                            ...

                                            Parameters

                                            ( fromClass, members ) : Ext.Basechainableprivatestatic
                                            Borrow another class' members to the prototype of this class. ...

                                            Borrow another class' members to the prototype of this class.

                                            Ext.define('Bank', {
                                                money: '$$$',
                                                printMoney: function() {
                                                    alert('$$$$$$$');
                                                }
                                            });
                                            
                                            Ext.define('Thief', {
                                                // ...
                                            });
                                            
                                            Thief.borrow(Bank, ['money', 'printMoney']);
                                            
                                            var steve = new Thief();
                                            
                                            alert(steve.money); // alerts '$$$'
                                            steve.printMoney(); // alerts '$$$$$$$'
                                            

                                            Parameters

                                            • fromClass : Ext.Base

                                              The class to borrow members from

                                            • members : Array/String

                                              The names of the members to borrow

                                            Returns

                                            ( args )protectedstatic
                                            ...

                                            Parameters

                                            ( alias, origin )static
                                            Create aliases for existing prototype methods. ...

                                            Create aliases for existing prototype methods. Example:

                                            Ext.define('My.cool.Class', {
                                                method1: function() {  },
                                                method2: function() {  }
                                            });
                                            
                                            var test = new My.cool.Class();
                                            
                                            My.cool.Class.createAlias({
                                                method3: 'method1',
                                                method4: 'method2'
                                            });
                                            
                                            test.method3(); // test.method1()
                                            
                                            My.cool.Class.createAlias('method5', 'method3');
                                            
                                            test.method5(); // test.method3() -> test.method1()
                                            

                                            Parameters

                                            ( parent )privatestatic
                                            ...

                                            Parameters

                                            Get the current class' name in string format. ...

                                            Get the current class' name in string format.

                                            Ext.define('My.cool.Class', {
                                                constructor: function() {
                                                    alert(this.self.getName()); // alerts 'My.cool.Class'
                                                }
                                            });
                                            
                                            My.cool.Class.getName(); // 'My.cool.Class'
                                            

                                            Returns

                                            ...
                                            ( name, mixinClass )privatestatic
                                            Used internally by the mixins pre-processor ...

                                            Used internally by the mixins pre-processor

                                            Parameters

                                            ( fn, scope )chainableprivatestatic
                                            ...

                                            Parameters

                                            ( members ) : Ext.Basechainabledeprecatedstatic
                                            Override members of this class. ...

                                            Override members of this class. Overridden methods can be invoked via callParent.

                                            Ext.define('My.Cat', {
                                                constructor: function() {
                                                    alert("I'm a cat!");
                                                }
                                            });
                                            
                                            My.Cat.override({
                                                constructor: function() {
                                                    alert("I'm going to be a cat!");
                                            
                                                    var instance = this.callParent(arguments);
                                            
                                                    alert("Meeeeoooowwww");
                                            
                                                    return instance;
                                                }
                                            });
                                            
                                            var kitty = new My.Cat(); // alerts "I'm going to be a cat!"
                                                                      // alerts "I'm a cat!"
                                                                      // alerts "Meeeeoooowwww"
                                            

                                            As of 2.1, direct use of this method is deprecated. Use Ext.define instead:

                                            Ext.define('My.CatOverride', {
                                                override: 'My.Cat',
                                            
                                                constructor: function() {
                                                    alert("I'm going to be a cat!");
                                            
                                                    var instance = this.callParent(arguments);
                                            
                                                    alert("Meeeeoooowwww");
                                            
                                                    return instance;
                                                }
                                            });
                                            

                                            The above accomplishes the same result but can be managed by the Ext.Loader which can properly order the override and its target class and the build process can determine whether the override is needed based on the required state of the target class (My.Cat).

                                            This method has been deprecated since 2.1.0

                                            Please use Ext.define instead

                                            Parameters

                                            • members : Object

                                              The properties to add to this class. This should be specified as an object literal containing one or more properties.

                                            Returns