0

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

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

例如: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

4

2 回答 2

2

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

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

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

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

  1. 将加载的存储放入数组中,您可以将数组附加到网格的父容器,使其不具有全局范围。比如myGridPanelsContainer.loadedStoresArray什么的。

  2. 检查是否所有需要的商店现在都在里面myGridPanelsContainer.loadedStoresArray

  3. 如果他们是然后创建网格。

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

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

于 2012-10-03T16:47:27.973 回答
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的惊人的“多文件上传器”

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

于 2013-01-29T23:21:54.493 回答