Знаете ли вы, что данные, возвращаемые из хранилища данных Ember, относятся к типу DS.RecordArray Ember? Как бы мы это проанализировали? Что, если бы мы хотели этим манипулировать? Не беспокойтесь, я покажу вам, как это сделать.
В этом посте я буду использовать ловушку setupController в маршруте для установки свойств маршрута.
entity: { accounts: [ { name: 'one' }, { name: 'two' } ] }
Чтобы упростить задачу, предположим, что наш магазин возвращает объект entity
со свойством accounts
, который представляет собой массив объектов со своими собственными свойствами.
Итак, давайте попробуем перебрать этот возвращенный объект, не так ли?
import Ember from 'ember';
export default Ember.Route.extend({ model(params) { let { entity_id } = params return Ember.RSVP.hash({ entity: this.get('store').findRecord('entity', entity_id) }) }, setupController(controller, model) { this._super(controller, model)
let accounts = model.entity.get('accounts')
// this works fine accounts.forEach((acc) => { console.log(acc.get('name')) }) } });
Одно небольшое примечание о RecordArray Ember заключается в том, что вместо использования оператора .operator для доступа к свойству объекта вы должны использовать метод get (‘objectName’), как я использовал его в приведенном выше коде.
В приведенном выше коде я извлек свойство account из объекта entity внутри setupController. Затем я просматриваю каждую учетную запись и записываю ее в консоль.
Что ж, по этой логике я должен быть в состоянии перебрать его, используя обычный цикл for и обращаясь к массиву с обозначением скобок [], верно? Итак, давайте обновим наш код, чтобы включить цикл for.
import Ember from 'ember';
export default Ember.Route.extend({ model(params) { let { entity_id } = params return Ember.RSVP.hash({ entity: this.get('store').findRecord('entity', entity_id) }) }, setupController(controller, model) { this._super(controller, model)
let accounts = model.entity.get('accounts')
// but this doesnt work for (let i = 0; i < accounts.get('length'); i++) { console.log(accounts[i]) // this is undefined } } });
Еще одно небольшое примечание: Ember RecordArray имеет встроенное свойство, называемое length, к которому мы можем получить доступ, чтобы получить длину массива. Более подробную информацию об этом можно найти здесь в документации Ember.
Так почему же accounts[i]
вернул нам undefined? Это связано с тем, как Ember RecordArray реализован под капотом. Чтобы получить к нему доступ, как мы привыкли к обычным массивам, нужно использовать их встроенный метод для RecordArrays, называемый objectAt(index)
. Поэтому вместо использования account [i] вам нужно будет do accounts.objectAt(i)
. Для получения дополнительной информации вы можете перейти здесь и ознакомиться с их руководством.
После того, как вы воспользуетесь методом objectAt(index)
, вы сможете получить доступ к свойству объекта так же, как раньше, accounts.objectAt(i).name
.
Мне потребовалось время, чтобы это понять, но как только я это сделал, я смог вернуться в свой поток и продолжить свой проект. Надеюсь, это поможет тем из вас, кто был в той же ситуации, что и я, но не мог понять этого! Ударься головой об стену и никогда не сдавайся!