等待加载多个ExtJS存储



我在代码的不同位置使用了多个存储(JSON)。一种用途是根据某些条件将这些数据聚合到一个新的存储中(维奇已经有了自己的数据)。

例如,我有两个存储:一个包含position_id,position_name,另一个包含role_id,role_name。现在有另一个部分初始化的存储,我想用两个先例存储来完成它

例如:StoreRoles:role_id,role_valueStorePositions:position_id,position_valueStoreLineup:lineup_id,参与者,角色_id,角色值,位置_id,位置值

当创建StoreLineup时,我希望role_value和position_value根据它们的id取值。

这是有效的,但并不总是如此。事实上,当ExtJS传递给StoreLineup初始化时,StoreRoles和StorePositions并不总是准备好的。最后,数据并不总是设置好的,在这一点上我会遇到一些JavaScript错误(因为我在现有元素中使用了get())。

所以我想延迟StoreLineup的初始化。当另外两个存储未加载时,StoreLineup不能也加载。它必须在完成其他商店的创建之后创建。

但是怎么做呢?我没有找到任何有效的解决方案(使用加载事件等)。目标是在GridPanel中呈现完整的StoreLineup。

我使用ExtJS 3.4

这在4.x中使用商店的isLoading方法要容易得多。

但是对于3.4,您可以使用负载侦听器来完成它。

在创建网格面板之前,在要加载的所有存储上附加一个加载侦听器。

在监听器中执行以下操作:

  1. 将加载的存储放入数组中,可以将数组附加到网格的父容器,这样它就没有全局作用域。例如myGridPanelsContainer.loadedStoresArray之类的。

  2. 检查是否所有需要的存储现在都在myGridPanelsContainer.loadedStoresArray

  3. 如果是,则创建栅格。

  4. 如果没有,那就什么都不做。

当最后一个存储加载时,加载侦听器将创建网格。

只是一个提示,使用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 惊人的"多文件上传器">

这里使用了相同的原理,但不是存储加载,而是文件上传,尽管我们的行为完全相同。

最新更新