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