Extjs получить все записи магазина

У меня есть один вопрос. Можно ли получить все записи, которые загружаются в хранилище, когда фильтры добавляются для хранения? Например, если я загружаю в хранилище 34 записи, а затем применяю фильтры, и осталось только 15, могу ли я получить эти 34 записи без очистки фильтров?

Ответ 1

Изменение: на это был дан ответ для Ext 4.2, где snapshot был общедоступным и документированным. Он ушел сегодня. Итак, здесь обновление для Ext 5 и 6.

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 для получения фактического массива элементов.

Ext 5 метод getUnfiltered

Метод getUnfiltered был введен в какой-то момент в Ext 5 (5.0.1, насколько я могу судить, но docs для Ext 5 сейчас отключены...). Он не присутствовал в первых версиях Ext 5, и его не было Ext 6. Итак, хорошо... Не используйте его! Если вы не хотите связать свой код с Ext 5 без каких-либо причин, используйте описанный выше метод.

Ext 4

(оригинальный ответ)

Весь загруженный набор данных сохраняется в свойстве snapshot магазина.

Он создается только тогда, когда это необходимо. Это означает, что свойство будет недоступно до того, как некоторые фильтры будут применены к хранилищу. Чтобы получить необходимую информацию безопасным способом, используйте:

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

Ext 4/5/6

(и, вероятно, будущие версии)

Вы можете использовать query или queryBy.

Это, по-видимому, более перспективный подход, поскольку, вопреки предыдущим методам, этот API не изменился в разных версиях.

К сожалению, это приведет к сбору коллекции и потребует дополнительных затрат на обработку... Что может быть или не быть незначительным в зависимости от размера вашей коллекции.

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

Ответ 2

Возможно, более продвинутый подход (например, ExtJS version> = 5) заключается в следующем:

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

Основываясь на документе, это должно работать для версий> = 5.0.

Ответ 3

Для получения всех нефильтрованных данных из загруженного хранилища вы можете попробовать var records = store.getUnfiltered();

Примечание. Я использую Ext Js 5.1. Не уверен в более ранних версиях.

Ответ 4

Если вы хотите получить необработанные записи только от ответа 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();

Ответ 5

Для моего случая с ExtJS 4.2.1 (да, я знаю его старый) с JSON TreeStore, мне пришлось использовать: store.proxy.reader.jsonData так как store.snapshot, store.data, store.query или store.queryBy сделали не существует.

Ответ 6

В последней версии Extjs 6.2.0 вы можете использовать

var allRecs = Store.getData().getSource().items