Extjs получить все записи магазина
У меня есть один вопрос. Можно ли получить все записи, которые загружаются в хранилище, когда фильтры добавляются в хранилище? Например, если я загружу в хранилище 34 записи, а затем применю фильтры, и останется только 15, смогу ли я получить эти 34 записи без очистки фильтров?
5 ответов
Edit: первоначально на это был дан ответ для 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
метод
A getUnfiltered
метод был введен в какой-то момент в Ext 5 (5.0.1, насколько я могу судить, но документы для 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
возможно, более прямой совместимый подход (т. е. версия ExtJS >= 5) заключается в следующем:
var allRecords = store.getData().getSource().getRange();
основываясь на documentaion, это должно работать для версий >= 5.0.
для получения всех нефильтрованных данных из загруженного магазина вы можете попробовать var records = хранить.getUnfiltered ();
Примечание: я использую Ext JS 5.1. Не уверен в более ранних версиях.