0

コード内のさまざまな場所で複数のストア(JSON)を使用しています。1つの用途は、いくつかの条件に応じて、これらを1つの新しいストア(すでに独自のデータを持っている)に集約することです。

たとえば、2つのストアがあります。1つはposition_id、position_nameを含み、もう1つはrole_id、role_nameを含みます。今、部分的に初期化された別のストアがあり、それを完了するために2つの先例ストアを使用したいと思います。

例: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の初期化を遅らせたいと思います。他の2つのストアはロードされませんが、StoreLineupもロードされてはなりません。他のストアを完全に作成した後に作成する必要があります。

しかし、それを行う方法は?実用的な解決策が見つかりませんでした(ロードイベントなどを使用)。目標は、GridPanelで完全なStoreLineupをレンダリングすることです。

ExtJS3.4を使用しています

4

2 に答える 2

2

これは、このようなストアのisLoadingメソッドを使用する4.xでははるかに簡単です。

ただし、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 に答える