Дождитесь загрузки нескольких хранилищ ExtJS

У меня есть несколько хранилищ (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 принимали значения в зависимости от их идентификаторов.

Это работает, но не всегда. На самом деле StoreRoles и StorePositions не всегда готовы, когда ExtJS переходит к инициализации StoreLineup. Наконец, данные не всегда установлены, и я получаю некоторые ошибки JavaScript в этой точке (потому что я использую get() для существующего элемента).

Поэтому я хотел бы отложить инициализацию StoreLineup. Пока два других магазина не загружены, StoreLineup тоже не должен быть. Он должен быть создан после полного создания других магазинов.

Но как это сделать ? Я не нашел рабочих решений (с использованием события загрузки и т. д.). Цель состоит в том, чтобы отобразить полный StoreLineup в GridPanel.

Я использую ExtJS 3.4.


person Community    schedule 03.10.2012    source источник


Ответы (2)


В версии 4.x это сделать намного проще, используя метод магазина isLoading, подобный этому.

Но для 3.4 вы можете сделать это, используя прослушиватели загрузки.

Прикрепите прослушиватель загрузки ко всем хранилищам, которые вы хотите загрузить, прежде чем создавать панель сетки.

В прослушивателе сделайте следующее:

  1. Поместите загруженное хранилище в массив, вы можете прикрепить массив к родительскому контейнеру сетки, чтобы он не имел глобальной области видимости. Например. myGridPanelsContainer.loadedStoresArray или что-то в этом роде.

  2. Проверьте, все ли необходимые магазины теперь находятся внутри myGridPanelsContainer.loadedStoresArray

  3. Если они есть, создайте сетку.

  4. Если нет, то ничего не делайте.

Когда загрузится последнее хранилище, прослушиватель загрузки создаст сетку.

person egerardus    schedule 03.10.2012
comment
Большое спасибо ! Я использую ваше решение, и оно отлично работает. За исключением того, что я не создаю сетку родственников статуса магазинов, а загружаю LineupStore, если все остальные магазины (от которых это зависит) полностью загружены. Таким образом, сетка заполняется только при загрузке LineupStore. - person ; 04.10.2012

Просто совет: использование 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
       }
    }
});

Этот пример основан на замечательном "Multi file uploader" от Ext4All.

Здесь используется тот же принцип, только вместо загрузки магазина происходит загрузка его файла, хотя поведение то же самое.

person byte_slave    schedule 29.01.2013