web-dev-qa-db-ja.com

Extjsはすべての店舗レコードを取得します

一つ質問があります。フィルターがストアに追加されるときにストアにロードされるすべてのレコードを取得することは可能ですか?たとえば、ストアに34レコードをロードしてからフィルターを適用し、残りが15だけの場合、フィルターをクリアせずにそれらの34レコードを取得できますか?

17
kuldarim

編集:これは、Ext 4.2で最初に回答されたもので、snapshotは公開され、文書化されていました。今日ではなくなっています。これが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.CollectiongetRange を使用して、アイテムの実際の配列を取得します。

Ext 5 getUnfilteredメソッド

getUnfilteredメソッドがExt 5のある時点で導入されました(私の知る限り、5.0.1ですが、Ext 5のドキュメントは現在オフラインです...)。 Ext 5の最初のバージョンには存在しませんでしたが、Ext 6には使用されていませんでした。そのため、使用しないでください。理由もなくコードをExt 5に関連付けたい場合を除き、上記の方法を使用します。

Ext 4

(元の回答)

ロードされたデータセット全体は、ストアの snapshot プロパティに格納されます。

ただし、必要な場合にのみ作成されます。つまり、一部のフィルターがストアに適用されるまで、プロパティは利用できません。安全な方法で必要な情報を取得するには、次を使用します。

var allRecords = store.snapshot || store.data;

内線4/5/6

(そしておそらく将来のバージョン)

query または queryBy を使用できます。

以前の方法とは異なり、このAPIはバージョン間で変更されていないため、これはより上位互換性のあるアプローチのようです。

残念ながら、これはコレクションを通過し、追加の処理コストが発生します...コレクションのサイズによっては、無視できる場合とない場合があります。

var allRecords = store
  .queryBy(function() { return true; }) // returns a collection
  .getRange(); // returns array of items
32
rixo

おそらく、より上位互換性のあるアプローチ(つまり、ExtJSバージョン> = 5)は次のとおりです。

var allRecords = store.getData().getSource().getRange();

ドキュメントに基づいて、これはバージョン> = 5.0で機能するはずです。

5
Mike Kelly

ロードされたストアからすべてのフィルタリングされていないデータを取得するには、var records = store.getUnfiltered();を試すことができます。

注:私はExt Js 5.1を使用しています。以前のバージョンについては不明です。

4
Sikandar

あなたが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();
2
Damiano

ExtJS 4.2.1(そうですね、古いのはわかっています)とJSON TreeStoreを使用する私の場合は、store.proxy.reader.jsonDataを使用する必要がありました:store.snapshotstore.datastore.queryまたはstore.queryByは存在しませんでした。

0
Emmanuel