一つ質問があります。フィルターがストアに追加されているときに、ストアにロードされているすべてのレコードを取得することは可能ですか? たとえば、ストアに 34 レコードをロードしてフィルターを適用すると、残りが 15 レコードしかない場合、フィルターをクリアせずにそれらの 34 レコードを取得できますか?
6 に答える
編集:snapshot
これはもともと公開され、文書化されているExt 4.2 に対して回答されたものです。それは今日なくなっています。Ext 5 と 6 のアップデートはこちらです。
内線 5 / 6
一発ギャグ:
var allRecords = (store.getData().getSource() || store.getData()).getRange();
分解:
var data = store.getData();
// get unfiltered collection (will be null if the store has never been filtered)
var snapshot = data.getSource();
// pick the one that exists
var unfilteredCollection = snapshot || data;
// get items in an array
var allRecords = unfilteredCollection.getRange();
Store#getData
ストアのコレクションを提供します。
Collection#getSource
ストアの「ソース」、つまりフィルター処理されていないコレクションを提供しますが、コレクションが既にフィルター処理されている場合にのみ、それ以外の場合は を返しますnull
。
どちらの場合も、Ext.util.Collection
. getRange
アイテムの実際の配列を取得するために使用します。
Ext 5getUnfiltered
メソッド
メソッドは Ext 5 のある時点で導入されましたgetUnfiltered
(私が知る限り 5.0.1 ですが、Ext 5 のドキュメントは現在オフラインです...)。Ext 5 の最初のバージョンには存在せず、Ext 6 ではなくなりました。理由もなくコードを Ext 5 に結び付けたくない場合を除き、上記の方法を使用してください。
内線 4
(元の回答)
読み込まれたデータセット全体がsnapshot
ストアのプロパティに保存されます。
ただし、必要な場合にのみ作成されます。つまり、一部のフィルターがストアに適用されるまで、プロパティは利用できません。したがって、安全な方法で必要な情報を取得するには、次を使用します。
var allRecords = store.snapshot || store.data;
内線 4 / 5 / 6
(そしておそらく将来のバージョン)
以前の方法とは対照的に、この API はバージョン間で変更されていないため、これはより前方互換性のあるアプローチのようです。
残念ながら、それはコレクションをトラバースし、余分な処理コストが発生します...コレクションのサイズによっては、無視できる場合とそうでない場合があります。
var allRecords = store
.queryBy(function() { return true; }) // returns a collection
.getRange(); // returns array of items
読み込まれたストアからフィルタリングされていないすべてのデータを取得するには、 var records = store.getUnfiltered(); を試すことができます。
注: Ext Js 5.1 を使用しています。以前のバージョンについては不明です。