一つ質問があります。フィルターがストアに追加されるときにストアにロードされるすべてのレコードを取得することは可能ですか?たとえば、ストアに34レコードをロードしてからフィルターを適用し、残りが15だけの場合、フィルターをクリアせずにそれらの34レコードを取得できますか?
編集:これは、Ext 4.2で最初に回答されたもので、snapshot
は公開され、文書化されていました。今日ではなくなっています。これがExt 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
を使用して、アイテムの実際の配列を取得します。
getUnfiltered
メソッドgetUnfiltered
メソッドがExt 5のある時点で導入されました(私の知る限り、5.0.1ですが、Ext 5のドキュメントは現在オフラインです...)。 Ext 5の最初のバージョンには存在しませんでしたが、Ext 6には使用されていませんでした。そのため、使用しないでください。理由もなくコードをExt 5に関連付けたい場合を除き、上記の方法を使用します。
(元の回答)
ロードされたデータセット全体は、ストアの snapshot
プロパティに格納されます。
ただし、必要な場合にのみ作成されます。つまり、一部のフィルターがストアに適用されるまで、プロパティは利用できません。安全な方法で必要な情報を取得するには、次を使用します。
var allRecords = store.snapshot || store.data;
(そしておそらく将来のバージョン)
以前の方法とは異なり、このAPIはバージョン間で変更されていないため、これはより上位互換性のあるアプローチのようです。
残念ながら、これはコレクションを通過し、追加の処理コストが発生します...コレクションのサイズによっては、無視できる場合とない場合があります。
var allRecords = store
.queryBy(function() { return true; }) // returns a collection
.getRange(); // returns array of items
おそらく、より上位互換性のあるアプローチ(つまり、ExtJSバージョン> = 5)は次のとおりです。
var allRecords = store.getData().getSource().getRange();
ドキュメントに基づいて、これはバージョン> = 5.0で機能するはずです。
ロードされたストアからすべてのフィルタリングされていないデータを取得するには、var records = store.getUnfiltered();を試すことができます。
注:私はExt Js 5.1を使用しています。以前のバージョンについては不明です。
あなたがhttp応答のみから生のレコードを取得したい場合-これが私の解決策です:
getRawRecords
関数をstore
クラスに追加します。
Ext.override(Ext.data.Store, {
getRawRecords: function(){
return Ext.Array.map(this.getData().getRange(), function(record){
return record.data;
});
}
});
使用法:
var rawData = store.getRawRecords();
ExtJS 4.2.1(そうですね、古いのはわかっています)とJSON TreeStoreを使用する私の場合は、store.proxy.reader.jsonData
を使用する必要がありました:store.snapshot
、store.data
、store.query
またはstore.queryBy
は存在しませんでした。