0

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

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

我在另一个 url 中使用 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)。如何分配其值形式存储以便可以重用?

谢谢

4

2 回答 2

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,然后再加载该商店。

恰兹

于 2012-05-06T12:28:19.990 回答
0

在这里,您loggedUser = Ext.create('Ext.data.Store', { model: 'loggedUserList', autoLoad: true,...}使用 Init.cp 声明在 load() 中分配了一些数据。但是您无法确认 Init.cp 在您声明变量时确实具有值vocabulary(即,可能还没有完全加载loggedUser)。所以它在 url 中仍然是 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定义的函数。

于 2012-05-06T08:55:42.793 回答