我的代码中的不同位置使用了多个商店(JSON)。一种用途是根据某些条件将这些聚合成一个新商店(已经有自己拥有的数据)。
例如,我有两个商店:一个包含position_id,position_name,另一个包含role_id,role_name。 现在有一个部分初始化的另一个商店,我想使用两个先例商店来完成它。
Ex:StoreRoles:role_id,role_value StorePositions:position_id,position_value StoreLineup:lineup_id,参与者,role_id,role_value,position_id,position_value
当创建StoreLineup时,我想将role_value和position_value取值取决于他们的ID。
这有效,但并非总是如此。 事实上,当ExtJS传递给StoreLineup初始化时,StoreRoles和StorePositions并不总是准备就绪。最后,数据并不总是设置,我在这一点上得到了一些JavaScript错误(因为我在现有元素中使用了get())。
所以我想延迟StoreLineup的初始化。 虽然没有加载其他两个商店,但StoreLineup也不一样。必须在完成其他商店的创建后创建它。
但是怎么做呢? 我没有找到任何有效的解决方案(使用加载事件等)。 目标是在GridPanel中呈现完整的StoreLineup。我使用ExtJS 3.4
答案 0 :(得分:2)
使用商店的isLoading
方法like this,这在4.x中要容易得多。
但对于3.4,您可以使用加载侦听器来完成它。
在创建网格面板之前,在要加载的所有商店上附加加载侦听器。
在听众中执行以下操作:
将加载的存储放入数组中,您可以将数组附加到网格的父容器中,以使其不具有全局范围。例如。 myGridPanelsContainer.loadedStoresArray
或其他。
检查所有需要的商店现在是否在myGridPanelsContainer.loadedStoresArray
如果是,则创建网格。
如果没有则不做任何事。
当最后一个商店加载时,加载监听器将创建网格。
答案 1 :(得分:0)
只是提示,使用Ext.util.MixedCollection而不是数组可以更方便。
Ext.define('My.app.StoreLoader', {
extend: 'Ext.util.MixedCollection',
singleton: true,
register: function (item) {
this.add(item);
},
unregister: function (item) {
this.remove(item);
},
getKey: function (o) {
return o.instanceId;
},
storeloadCallback: function (id, data) {
var item = this.get(id);
if (item) {
this.unregister(item);
//do more stuff if needed, like fire custom events, etc
}
}
});
此示例基于Ext4All
中令人惊叹的“多文件上传器”这里使用相同的原则,但是不是存储加载,而是文件上传,尽管我们的行为非常相似。