等待加载多个ExtJS存储

时间:2012-10-03 16:26:37

标签: javascript extjs store extjs3

我的代码中的不同位置使用了多个商店(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

2 个答案:

答案 0 :(得分:2)

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

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

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

在听众中执行以下操作:

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

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

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

  4. 如果没有则不做任何事。

  5. 当最后一个商店加载时,加载监听器将创建网格。

答案 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

中令人惊叹的“多文件上传器”

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