Search code examples
extjs4

ExtJs:Initializing a global variable


I have a global variable which needs to be initialized when the store is loaded and needs to use that value in another store as follows

var cp = 0;

Ext.onReady(function() {
    Ext.define('Init', {
        singleton: true,
        cp: 0
    });

    Ext.define('loggedUserList', {
        extend: 'Ext.data.Model',
        fields: [
            'id',
            'name'
        ]
    });

    loggedUser = Ext.create('Ext.data.Store', {
        model: 'loggedUserList',
        autoLoad: true,
        proxy: {
        type: 'ajax',
        url: url+'/lochweb/loch/users/getLoggedUser',
        reader: {
            type: 'json',
            root: 'provider'
        },
        listeners: {
            load: function(loggedUser) {
                Init.cp = loggedUser.getAt(0).data.id;
            }
        }
    }); 
});

I am using the value of cp in another url as follows: url: url + '/lochweb/loch/vocabulary/getVocabularyByProvider?providerId=' + Init.cp,

Ext.define('vocbList', {
    extend: 'Ext.data.Model',
    fields: [
        {
            name: 'id',
            mapping: 'id'
        },
        {
            name: 'code',
            mapping: 'code'
        }
    ]
});

var vocabulary = Ext.create('Ext.data.Store', {             
    model: 'vocbList',
    autoLoad: true,
    proxy: {
        type: 'ajax',                   
        url: url+'/lochweb/loch/vocabulary/getVocabularyByProvider?providerId='+Init.cp,                    
        reader: {
            type: 'json',
            root: 'Vocabulary'
        }
    }
});

but its value is still 0. I tried using(cp, Init.cp). How to assign its value form store so that it can be reused?

Thanks


Solution

  • Store loads data asynchronously, so you can't be sure that Init.cp will be initialized with a new value before the other store is been loaded. Try with this:

    var cp=0;
    
    Ext.onReady(function(){
    Ext.define('Init', {
        singleton: true,
        cp: 0
    });
    
    Ext.define('vocbList', {
                extend: 'Ext.data.Model',
                fields: [
                    { name: 'id', mapping: 'id' },
                    { name: 'code', mapping: 'code' }
    
                ]
            });
    
    
    
        var vocabulary = Ext.create('Ext.data.Store', {             
            model: 'vocbList',
            proxy: {
                type: 'ajax',                                   
                reader:  {
                    type: 'json',
                    root: 'Vocabulary'
                }
            }
    
    Ext.define('loggedUserList', {
                    extend: 'Ext.data.Model',
                    fields: ['id','name']
                });
    
                loggedUser = Ext.create('Ext.data.Store', {
                    model: 'loggedUserList',
                    autoLoad: true,
                    proxy: {
                        type: 'ajax',
                        url : url+'/lochweb/loch/users/getLoggedUser',
                        reader: {
                         type: 'json',
                            root: 'provider'
                        }                   
                    },
                    listeners: {
                        load:function(loggedUser){
                            Init.cp = loggedUser.getAt(0).data.id;
                            vocabulary.getProxy().url = url+'/lochweb/loch/vocabulary/getVocabularyByProvider?providerId='+Init.cp;
                            vocabulary.load();
                        }
                    }
    
                }); 
    });
    

    As you can see, you have to set the url of the vocabulary proxy dynamically when the first store is just loaded and then load the store.

    Cyaz