Javascript 在视图之前加载Extjs存储

Javascript 在视图之前加载Extjs存储,javascript,model-view-controller,extjs,constructor,store,Javascript,Model View Controller,Extjs,Constructor,Store,我有这样一种观点: Ext.define('Webedi.view.zones.Menu', { store: 'PartnerSettings', extend: 'Ext.panel.Panel', . . . . adminPanelEnabled: false, initComponent: function() { var me = this;

我有这样一种观点:

Ext.define('Webedi.view.zones.Menu', {
    store: 'PartnerSettings',
    extend: 'Ext.panel.Panel',
            .
            .
            .
            .
    adminPanelEnabled: false,
    initComponent: function() {
        var me = this;

console.log(Ext.getStore('Userrights').findExact("name","admin_panel_access"));

          if(Ext.getStore('Userrights').findExact("name","admin_panel_access") !== -1) me.adminPanelEnabled = true;
//        if(Ext.getStore('PartnerSettings').getAt(0).get('purchasingOrganisation').enabled ) me.purchasingOrganisationEnabled = true;
        this.items = [
                    .
                    .
                    .
                    .

                    {
                        id: 'adminpanel',
                        itemId: 'adminpanel',
                        xtype: 'button',
                        text: Translation.ZonesMenuAdminPanel,
                        action: 'adminpanel',
                        margin: '3 3 0 3',
                        hidden: !me.adminPanelEnabled
                    }
                ]
            }
        ];

        this.callParent();
    }
});
问题是

 if(Ext.getStore('Userrights').findExact("name","admin_panel_access") !== -1)
在代码部分运行时尚未填充:

 hidden: !me.adminPanelEnabled

initComponent
函数起作用了?

在处理存储时(通常在进行ajax调用时)应该使用回调。在您的情况下,应该在存储完成加载时创建视图(使用
load
事件并让回调创建视图),或者创建一个
adminPanelEnabled()
方法,该方法由存储的
load
事件调用

这两个变体有一个共同点,它们在存储完成加载时执行

另外:如果您只需要一次,您可以将事件注册为某种单例事件

store.on('load', function(/*see api for ful arg list*/) {}, scope, { single:true })

好的,谢谢你@seba,感谢我在constructor中提出的想法

    applicationName.getApplication().on('allStoresLoaded', function() {
        console.log(Ext.getStore('Userrights').findExact("name", "admin_panel_access"))

    });

现在它可以工作了:正如你所说,你需要等待。在加载存储之前不要创建视图。加载存储区,等待回调,然后加载视图。autoShow:真的是这种情况的罪魁祸首吗?不,以前调用过initComponent。在创建视图之前,您需要等待sote完成加载。在您的示例中,您可能不会显示
autoShow
,也不会显示您最终创建视图的时间。感谢您在所有商店完成加载后我创建的应用程序事件中提出的想法。在app.js(Sencha ExtJS MVC)中,我使用了。。。store.on('load',function(){Ext.application(....});你能帮我理解你做了什么吗?我在代码中实现了同样的事情,但我不太明白你是如何创建if/then语句来切换配置的,或者这个app.getApplication()在哪里.on handler调用?这很简单,应用程序名就是您创建的应用程序,比如store,或者不知道是什么。它就是您正在运行的应用程序。get store on It获取一个存储并在事件上添加一个操作,该操作稍后会正确处理。