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

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


person kuldarim    schedule 06.09.2013    source источник


Ответы (6)


Редактировать: изначально был дан ответ для 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.Collection. Используйте getRange, чтобы получить фактический массив элементов.

Метод доб. 5 getUnfiltered

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

Доп. 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
person rixo    schedule 06.09.2013
comment
Я не понимаю, почему Sencha так сложно разместить метод getAllRecords() в магазине. Это кажется неинтуитивным - person Oliver Watkins; 18.11.2014
comment
Да... Я думаю, что это проблема, которую они пытаются решить, добавляя сетевые магазины в Ext 5. - person rixo; 19.11.2014
comment
Я бы рекомендовал использовать store.query(), потому что это общедоступный и документированный API, а снэпшот — нет. - person Alexander; 01.06.2017
comment
@ Александр Это было ... когда оно существовало. Я обновил свой ответ для более новых версий. Спасибо за уведомление. - person rixo; 01.06.2017

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

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

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

person Mike Kelly    schedule 09.07.2015
comment
В 6.0.2 я просто использую: var recs = store.getRange(); - person Jess; 11.04.2016
comment
store.getRange(); возвращает только отфильтрованные записи - person Guid; 08.03.2017
comment
Предупреждение: это работает, только если магазин в настоящее время отфильтрован. В противном случае генерируется TypeError. - person Martin Wickman; 15.11.2017

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

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

person Sikandar    schedule 16.06.2015
comment
getUnfiltered() недоступен в Ext 6.x - person harryBundles; 01.06.2017

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

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

person Emmanuel    schedule 24.01.2019

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

var allRecs = Store.getData().getSource().items
person AngryLeo    schedule 26.04.2017
comment
Предупреждение: getSource() возвращает null, если хранилище отфильтровано. Не используйте это. - person Martin Wickman; 15.11.2017