4

まったく同じデータ(つまり、同じstore.proxy.url)を使用する2つのSencha / ExtJS4グリッドがありますが、それぞれが異なるフィルターを使用しているため、それぞれに独自のストアがあります。問題は、使用する余分なコピーを取得するために不要なAJAX呼び出しを行っていることです。

独立したフィルタリングのために、単一のAJAX呼び出しを行い、2つのストア間でデータを共有するための推奨されるアプローチは何ですか?

考えられる解決策:

  • 同じストアを拡張する2つのクラスを作成しますか?
  • 同じプロキシインスタンスを使用しますか?
  • 1つのストアを取得し、それを複製しますか?
4

2 に答える 2

2

Ext JS 4フレームワークは、各ビューが独自のストアを受け取ることを意図して構築されているようです。他の回答で述べたように、最善のオプションは、2番目のストアを作成し、すべてのレコードを一方から他方にコピーすることです。

function cloneStore(src, dest) {
    var recs = src.getRange(); // returns array of records
    dest.loadRecords(recs);  // removes existing records before batch add
}

その関数の正確な実装は、データをどのように分散させる必要があるかによって異なる場合があります。各グリッドが最初にデータのサブセットのみを必要とする場合は、Ajax呼び出しからマスターストアを初期化し、store.dataMixedCollectionで直接フィルターを使用して2つのサブストアを作成できます。

// Note: This function isn't exactly "good practice"
// Actual implementation may vary
function populateSubStores(master, storeA, storeB) {
    var dataA = master.data.filter(/* filter criteria for store A */),
        dataB = master.data.filter(/* filter criteria for store B */);
    // dataA and dataB are MixedCollections of records
    storeA.loadRecords(dataA.getRange());
    storeB.loadRecords(dataB.getRange());
}

またはそのいくつかのバリエーション。これはあなたが正しい方向に始めるのに十分なはずです。

あなたが本当にガンホーなら、異なるビューからのフィルター状態を表す個別のMixedCollectionsを維持する新しいタイプのストアを作成し、各フィルター状態を、と同じインターフェースをExt.data.Store持つが、"で動作する実装を持つストアとして返すことができます。マスター」ストアの内部表現。これにより、既存のビューがオーバーライドなしで動作できるようになります。しかし、私はそれをお勧めしません。

于 2012-04-06T17:59:17.043 に答える
1

getRange()1つのストアの2つのインスタンスを作成してから、andadd()メソッドを使用して1つのストアから別のストアにデータをコピーすることができます。2つのクラスを作成するのは合理的ではないようです。

于 2012-04-06T12:30:24.960 に答える