使用Ext.each减量循环

时间:2017-10-05 20:33:38

标签: javascript extjs extjs5

在两个网格同时加载数据的组件(例如制表符)中,我使用以下函数创建一个全局掩码,只有在加载所有存储时才会删除该掩码。它通常运作良好。

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

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

问题是每次我选择一行(selectChange事件)时,indexStores--都会给出​​以下值(它可以正常运行,但倒计时不正确)。

//first selection
1
2
1
0

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

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

1 个答案:

答案 0 :(得分:2)

你留下你的老听众,只需添加新的听众。这意味着每次加载存储时,旧的侦听器都会从零倒数到零以下。

为了防止使用侦听器使商店混乱,可能会使应用程序随着时间的推移而减慢,您应该标记侦听器single,这将在第一次触发后删除侦听器:

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

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