Search code examples
sencha-touch-2sencha-architect

Singleton - Undefined?


I'm trying to get familiar with singleton in sencha, but my getters return me UNDEFINED everytime... Why? My alert should be displaying 'Bob' but it returns undefined.

here is my handler

handler: function(button, event) {
        var user = Prototype.model.Profile;
        alert(user._username);}

Here is my singleton

Ext.define('Prototype.model.Profile', {
extend: 'Ext.data.Model',

singleton: true,

config: {
    fields: [
        {
            name: 'listEvent',
            type: 'auto'
        },
        {
            name: 'listBusiness',
            type: 'auto'
        },
        {
            name: 'listTravel',
            type: 'auto'
        },
        {
            defaultValue: {
                username: 'bob'
            },
            name: 'username'
        }
    ]
},

addTravel: function(newTravel) {

    this._listTravel.push(newTravel);
},

getTravel: function(travelTitle) {

    var travel;

    for(var i=0; i<this._listTravel().getLength(); i++)
    {
        if(this._listTravel[i].getTitle()==travelTitle)
        {
            travel=this._listTravel[i];
            break;
        }
    }


}

});

Solution

  • First, I think the config part for that should be:

    config: {
        fields: [
            {
                name: 'listEvent',
                type: 'auto'
            },
            {
                name: 'listBusiness',
                type: 'auto'
            },
            {
                name: 'listTravel',
                type: 'auto'
            },
            {
                defaultValue: 'bob', // Instead of extra 'username' here
                name: 'username'
            }
        ]
    },
    

    However, I don't think singletons are meant to be used that way (with Model class). Because singleton will always only create a single instance to your class while your Model objects usually should be independent.

    In my opinion, you should only use singleton for util classes. Something that you want to call in any context. Like this:

    Ext.define('myApp.utils.AppConfig', {
        singleton: true,
        // Default value declared like this, without the config object
        defaultValue: 'something', 
        alternateClassName: 'AppConfig',
        log: function(text) {
            if (typeof console !== 'undefined') {
                console.log(text);
            }
        }
    });
    

    Then call it like this in your controllers/views

    AppConfig.log('Oh yes ' + AppConfig.defaultValue); // print 'Oh yes something'