Сортировать массив объектов 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));
  })
Другие вопросы по тегам