Javascript extjs setLoading()无法从控制器工作

Javascript extjs setLoading()无法从控制器工作,javascript,model-view-controller,extjs,Javascript,Model View Controller,Extjs,我有一个带按钮的gridview。单击按钮时,它从控制器调用一个方法。在这种方法中,我试图显示一个加载屏幕,然后做一些事情,然后隐藏加载屏幕。像这样: Ext.getCmp('center-panel').setLoading(true); // do something that takes a couple seconds Ext.getCmp('center-panel').setLoading(false); 但是setLoading(true)直到方法完成运行后才会生

我有一个带按钮的gridview。单击按钮时,它从控制器调用一个方法。在这种方法中,我试图显示一个加载屏幕,然后做一些事情,然后隐藏加载屏幕。像这样:

Ext.getCmp('center-panel').setLoading(true);        
// do something that takes a couple seconds
Ext.getCmp('center-panel').setLoading(false);
但是setLoading(true)直到方法完成运行后才会生效。如果我注释掉setLoading(false),加载屏幕将自动显示,直到2秒钟之后,然后再也不会消失

有人知道这是可能的还是我做错了什么?中心面板在“我的视口”中定义如下:

Ext.define('HelperBatchForm.view.Viewport', {
extend: 'Ext.container.Viewport',    
layout: 'fit',
items: [
    {
        region: 'center',
        id: 'center-panel',
        title: 'Batches',
        split: true,
        collapsible: true,
        xtype: 'batchgrid'
    }
    ,
    {
        region: 'south',
        id: 'south-panel',
        title: 'Batch Form',
        split: true, 
        //collapsible: true,            
        xtype: 'batchedit'            
    }
],

initComponent: function () {
    this.callParent(arguments);
}

});
谢谢

必须为ID使用“#”:

Ext.getCmp('#center-panel').setLoading(true); 

无论如何,你不想在你的“需要几秒钟的事情”之后马上调用setLoading(false),因为它会很快被解雇

您希望将回调函数传递到任何需要几秒钟时间的函数中,然后从那里调用setLoading(false)

例如:

somePanel.setLoading(true);

someStore.load({

  callback:function(){

    somePanel.setLoading(false);

  }
}); 

我也遇到了同样的问题,并通过在存储的“beforeload”侦听器中调用setLoading(true)和在load回调中调用setLoading(false)解决了这个问题。那很好用

以下是一个视图控制器的示例:

configureStore: function(store) {
    var me = this;
    store.on('beforeload', me.onStoreBeforeLoad, me);
    store.load({
        callback:function() {
            me.getView().setLoading(false);
        }
    });
},

onBeforeStoreLoad: function(store, operation, eOpts) {
    this.getView().setLoading(true);
}

在加载之前,您需要显示面板/任何内容。例如:

        var pnl = Ext.create('my.WhateverPanel');
        pnl.show();
        pnl.setLoading(true);
        setTimeout(function (){
            pnl.setLoading(false);
        }
        ,3000);

所以我找不到一个完美的解决方案,但我发现一个很好的解决办法是

Ext.getCmp('center-panel').setLoading(true); 
Ext.Function.defer(function () {
    // do something that takes a couple of seconds in here
    Ext.getCmp('center-panel').setLoading(false);
}, 10);
this.getView().setLoading('Loading module…')
setTimeout(函数(){
//处理下一步要执行的操作。例如:me.setCurrentView(id);

} , 1);

无论出于何种原因,Ext.getCmp('center-panel')都会返回该面板。setLoading实际上打开了加载掩码,它只是在函数调用完成后才显示(只有在我注释掉关闭它的代码的情况下)。Ext.getCmp(“#中心面板”)返回未定义的。我认为setLoading(false)调用过快也不是问题所在。如果我删除setLoading(false),我们会得到2秒的延迟,然后我们会看到“Loading…”屏幕。谢谢,你解决过这个问题吗?我遇到了同样的问题,代码似乎是先执行的,然后发生setLoading(true),即使我将它按顺序放在代码之前