У меня есть один вопрос. Можно ли получить все записи, которые загружаются в хранилище, когда фильтры добавляются для хранения? Например, если я загружаю в хранилище 34 записи, а затем применяю фильтры, и осталось только 15, могу ли я получить эти 34 записи без очистки фильтров?
Extjs получить все записи магазина
Ответ 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