Ext.each 递减循环计数不正确

Incorrect count with Ext.each decrement loop

在两个网格同时加载数据的组件(例如选项卡)中,我使用以下函数创建一个全局掩码,该掩码只有在商店全部加载后才会被删除。通常效果很好。

    testLoadAllStores: function(allStores, component){

        var indexStores = 0;

        setTimeout(function () {

            Ext.each(allStores, function(storeId) {
                var store = Ext.getStore(storeId);
                 if(store){
                    if(store.isLoading()){
                        indexStores++
                        console.log(indexStores);

                        store.on('load', function() {
                             indexStores--;
                             console.log(indexStores);
                            if (indexStores == 0){
                                setTimeout(function() {
                                    if(component.isMasked()){
                                          component.unmask();
                                    }
                                 }, 500);
                            }
                        });

                    }
                    else if(!store.isLoading() && indexStores == 0){
                        setTimeout(function() {
                            if(component.isMasked()){
                                  component.unmask();
                            }
                         }, 500);
                    }

                 }
            });
        }, 500);
    }

在控制器中函数调用如下

    var allStores = ['storeOne', 'storeTwo'];
    var component = Ext.getBody();
    component.mask();
    App.util.Util.testLoadAllStores(allStores, component);

但是在以下情况下我遇到了问题:每次网格的一行 selected 时都会显示两个图表。在这种情况下,函数 testLoadAllStores 被调用,并且只有当图表存储被加载时,才会触发取消屏蔽。

问题是每次我 select 一行(selectChange 事件)indexStores-- 给出以下值(它有效但 countdown 不正确)。

//first selection
1
2
1
0

//second selection
1
2
-1
1
-2
0

// third selection
1
2
-3
-1
1
-4
-2
0

您保留了旧的听众,并在顶部添加了新的听众。这意味着每次加载商店时,旧听众都会从零倒数到零以下。

为了防止您的商店因监听器而变得混乱,可能会随着时间的推移降低应用程序的速度,您应该标记监听器 single,这将在监听器首次触发后将其删除:

store.on('load', function() {
    ...
}, this, {
    single: true
});

此处说明:http://docs.sencha.com/extjs/6.2.1/classic/Ext.Evented.html#method-on--options