ExtJs:初始化全局变量

时间:2012-05-06 06:45:12

标签: extjs4

我有一个全局变量,需要在加载商店时进行初始化,并且需要在另一个商店中使用该值,如下所示

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

我在另一个网址中使用cp的值如下: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'
        }
    }
});

但它的值仍为0.我尝试使用(cp,Init.cp)。如何分配其值表单存储以便可以重用它?

由于

2 个答案:

答案 0 :(得分:4)

以异步方式存储加载数据,因此在加载其他存储之前,无法确定Init.cp是否会使用新值进行初始化。 试试这个:

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

            }); 
});

如您所见,您必须在刚刚加载第一个商店时动态设置词汇表代理的URL,然后加载商店。

Cyaz

答案 1 :(得分:0)

在此声明loggedUser = Ext.create('Ext.data.Store', { model: 'loggedUserList', autoLoad: true,...},其中Init.cp在load()中分配了一些数据。但是,在声明变量vocabulary时,无法确认Init.cp实际上是否具有值(即,可能还没有完全加载了LoginUser)。所以它在网址中仍为0。

要确认,您应将vocbListvocabulary的代码移动到一个函数中:

function vocabularyLoad() {
   Ext.define('vocbList', {...});
   var vocabulary = ...
}

并在loggedUser

中以这种方式使用此功能
loggedUser = Ext.create('Ext.data.Store', {
    ...
    listeners: {
         load:function(loggedUser){
              Init.cp = loggedUser.getAt(0).data.id;
              vocabularyLoad();
         }
    }
 });

但实际上,这种重构使Init.cp的赋值变得多余,因为您可以直接将loggedUser.getAt(0).data.id的值传递给已定义的函数。