Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待加载多个ExtJS存储_Javascript_Extjs_Store_Extjs3 - Fatal编程技术网

Javascript 等待加载多个ExtJS存储

Javascript 等待加载多个ExtJS存储,javascript,extjs,store,extjs3,Javascript,Extjs,Store,Extjs3,我在代码中的不同位置使用了多个存储(JSON)。一个用途是根据某些条件将这些数据聚合到一个新的存储中(wich已经拥有自己的数据) 例如,我有两个存储区:一个存储区具有position\u id、position\u name,另一个存储区包含role\u id、role\u name。 现在有另一个部分初始化的存储,我想使用两个前置存储来完成它 Ex:StoreRoles:role\u id、role\u值 StorePositions:position\u id、position\u值 St

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

例如,我有两个存储区:一个存储区具有position\u id、position\u name,另一个存储区包含role\u id、role\u name。 现在有另一个部分初始化的存储,我想使用两个前置存储来完成它

Ex:StoreRoles:role\u id、role\u值 StorePositions:position\u id、position\u值 StoreLineup:lineup\u id、参与者、角色\u id、角色\u值、职位\u id、职位\u值

在创建StoreLineup时,我希望role_值和position_值根据其ID取值

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

所以我想推迟StoreLineup的初始化。 虽然没有加载其他两个存储,但StoreLineup不能太多。必须在完全创建其他存储之后创建它

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


我使用extjs3.4

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

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

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

在listener中,执行以下操作:

  • 将加载的存储放在数组中,可以将该数组附加到网格的父容器,使其不具有全局作用域。例如,
    myGridPanelsContainer.loadedStoresArray
    或其他东西

  • 检查是否所有需要的存储现在都在myGridPanelsContainer.LoadedStoresRay中

  • 如果是,则创建网格

  • 如果没有,那就什么也不做


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

    只是一个提示,使用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
           }
        }
    });
    
    这个例子是基于惊人的“多文件上传器”从


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

    非常感谢!我使用你的解决方案,效果很好。除此之外,我不创建存储状态的网格关联,而是在所有其他存储(取决于它)都已完全加载的情况下加载LineupStore。因此,只有在加载LineupStore时才会填充网格。