Сортировать массив объектов Ember с обещаниями
У меня есть модель модель / человек
{
firstName: DS.attr( 'string'),
lastName: DS.attr( 'string'),
email: DS.attr( 'string' ),
}
и другая модель модель / проект
{
name: DS.attr( 'string' ),
code: DS.attr( 'string' ),
startDate: DS.attr( 'date' ),
endDate: DS.attr( 'date' ),
users : DS.hasMany('person', {async: true}),
}
Затем я получаю все проекты в виде массива, который содержит угасающие объекты. так как проект -> пользователи является асинхронным, это обещание. и я хочу отсортировать этот массив, используя имя человека. когда данные поступят соответственно и заново отрендерим hbs, использующий список
у меня есть вычисленное свойство под названием
renderProjects = computed ('model.projects.[]')
{
// trying to sort in here but data is not avaiable so its not getting sorted
}
2 ответа
Решение просто в использовании .@each
:
renderProjects: computed ('model.projects.@each.firstName', function() {
return this.users.sortBy('firstName');
})
это пересчитает renderProjects
CP всякий раз, когда список проектов меняется или любой firstName
на любом из проектов изменения, а затем автоматически обновлять ваш взгляд.
Одно важное замечание: вы не можете сделать .@each.foo.bar
, Это то, что вы сделали с model.@each.myUser.name
,
В вашем тиддле самое простое решение - добавить computed.alias
к video
модель:
username: computed.alias('myUser.name'),
Тогда вы можете сделать это:
sortedVideos: computed('model.@each.username', function() {
return this.get('model').sortBy('username');
})
Я бы реализовал наблюдателя, который следит за массивом проекта. Внутри обозревателя я бы разрешил сортировку массива проектов по отношениям пользователей.
Пожалуйста, проверьте следующий фрагмент кода.
modelObserver: observer('model.[]', function() {
let userPromises = this.get('model').map(project => project.get('users'));
RSVP.all(userPromises).then(function() {
this.set('sortedProjects', this.get('model').sortBy('users.firstObject.name'));
}.bind(this));
})