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