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. Не уверен в более ранних версиях.


если вы хотите получить необработанные записи только из http-ответа-вот мое решение:

добавить


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

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