У меня есть один вопрос. Можно ли получить все записи, загружаемые в хранилище при добавлении фильтров в хранилище? Например, если я загружу в хранилище 34 записи, а затем применю фильтры, а останется только 15, смогу ли я получить эти 34 записи без очистки фильтров?
Extjs получает все записи магазина
Ответы (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
store.query()
, потому что это общедоступный и документированный API, а снэпшот — нет.
- person Alexander; 01.06.2017
Возможно, подход с более прямой совместимостью (т.е. версия ExtJS >= 5) выглядит следующим образом:
var allRecords = store.getData().getSource().getRange();
Судя по документации, это должно работать для версий >= 5.0.
store.getRange();
возвращает только отфильтрованные записи
- person Guid; 08.03.2017
Для получения всех нефильтрованных данных из загруженного хранилища вы можете попробовать 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
не существовало.
В последних версиях Extjs 6.2.0 вы можете использовать
var allRecs = Store.getData().getSource().items