Ext JS 4.1.3 Sencha Docs

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('Address', {
    extend: 'Ext.data.Model',
    fields: [
        { name: 'id',          type: 'int' },
        { name: 'number', type: 'string' },
        { name: 'street', type: 'string' },
        { name: 'city', type: 'string' },
        { name: 'zip', type: 'string' },
    ]
});

Ext.define('Person', {
    extend: 'Ext.data.Model',
    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' }]
});

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 = new 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 associatied 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
})

Customisation

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', {
    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.

Available since: 4.1.0

Defined By

Config options

The string name of the model that is being associated with. ...

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.

Available since: 4.0.0

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 name of the associated model.

Available since: 4.0.0

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

Available since: 4.1.0

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

Available since: 4.1.0

The string name of the model that is being associated with. ...

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.

Available since: 4.1.1

The string name of the model that owns the association. ...

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.

Available since: 4.0.0

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'

Available since: 4.0.0

A special reader to read associated data

A special reader to read associated data

Available since: 4.0.0

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

Available since: 4.1.0

Ext.data.association.HasOne
view source
: String
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 'hasOne' to create a HasOne association.

associations: [{
    type: 'hasOne',
    model: 'Address'
}]

Available since: 4.1.0

Properties

Defined By

Instance properties

...

Defaults to: 'Ext.Base'

Available since: 4.1.1

The name of the model is on the other end of the association (e.g. ...

The name of the model is on the other end of the association (e.g. if a User model hasMany Orders, this is 'Order')

Available since: 4.0.0

...

Defaults to: {}

Available since: 4.1.1

...

Defaults to: []

Available since: 4.1.1

...

Defaults to: {}

Available since: 4.1.1

...

Defaults to: true

Available since: 4.1.1

...

Defaults to: true

Available since: 4.1.1

The name of the model that 'owns' the association

The name of the model that 'owns' the association

Available since: 4.0.0

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'

Available since: 4.0.0

Defined By

Static properties

...

Defaults to: []

Available since: 4.1.1

Methods

Defined By

Instance methods

Creates the Association object. ...

Creates the Association object.

Available since: 4.0.0

Parameters

  • config : Object (optional)

    Config object.

Returns

Fires

    ( args ) : Objectdeprecatedprotected
    Call the original method that was previously overridden with override Ext.define('My.Cat', { constructor: functi...

    Call the original method that was previously overridden with override

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

    Available since: 4.0.0

    This method has been deprecated

    as of 4.1. Use callParent instead.

    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.

    Available since: 4.0.0

    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

    ( args ) : Objectprotected
    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".

    Available since: Ext JS 4.1.3

    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

    ...

    Available since: 4.1.1

    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.

    Available since: 4.1.0

    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

      Available since: 4.1.0

      Returns

      Fires

        ...

        Available since: 4.1.0

        Parameters

        Returns the initial configuration passed to constructor when instantiating this class. ...

        Returns the initial configuration passed to constructor when instantiating this class.

        Available since: 4.1.0

        Parameters

        • name : String (optional)

          Name of the config option to return.

        Returns

        • Object/Mixed

          The full config object or a single config value when name parameter specified.

        Get a specialized reader for reading associated data ...

        Get a specialized reader for reading associated data

        Available since: 4.0.0

        Returns

        ...

        Available since: 4.1.0

        Parameters

        ( config ) : Ext.Basechainableprotected
        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'
        

        Available since: 4.0.0

        Parameters

        Returns

        ( names, callback, scope )private
        ...

        Available since: 4.1.0

        Parameters

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

        Read associated data

        Available since: 4.1.0

        Parameters

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

        Available since: 4.0.0

        Parameters

        Returns

        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
        

        Available since: 4.0.0

        Returns

        Defined By

        Static methods

        ( config )privatestatic
        ...

        Available since: 4.1.1

        Parameters

        ( members )chainableprivatestatic
        ...

        Available since: 4.1.1

        Parameters

        ( name, member )chainableprivatestatic
        ...

        Available since: 4.1.1

        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();
        

        Available since: 4.1.0

        Parameters

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

        Add / override static properties of this class.

        Ext.define('My.cool.Class', {
            ...
        });
        
        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() { ... };
        });
        

        Available since: 4.0.2

        Parameters

        Returns

        ( xtype )chainableprivatestatic
        ...

        Available since: 4.1.1

        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 '$$$$$$$'
        

        Available since: 4.0.2

        Parameters

        • fromClass : Ext.Base

          The class to borrow members from

        • members : Array/String

          The names of the members to borrow

        Returns

        ( 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()
        

        Available since: 4.0.2

        Parameters

        ( config )privatestatic
        ...

        Available since: 4.1.1

        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'
        

        Available since: 4.0.4

        Returns

        ( )deprecatedstatic
        Adds members to class. ...

        Adds members to class.

        Available since: 4.0.2

        This method has been deprecated since 4.1

        Use addMembers instead.

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

        Used internally by the mixins pre-processor

        Available since: 4.1.1

        Parameters

        ( fn, scope )chainableprivatestatic
        ...

        Available since: 4.1.1

        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!");
        
                this.callParent(arguments);
        
                alert("Meeeeoooowwww");
            }
        });
        
        var kitty = new My.Cat(); // alerts "I'm going to be a cat!"
                                  // alerts "I'm a cat!"
                                  // alerts "Meeeeoooowwww"
        

        As of 4.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!");
        
                this.callParent(arguments);
        
                alert("Meeeeoooowwww");
            }
        });
        

        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).

        Available since: 4.0.2

        This method has been deprecated since 4.1.0

        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

        ...

        Available since: 4.1.1