Сортировка Ember Object Array с обещаниями - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть модель / персона модели

{

  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 ]

0 голосов
/ 22 ноября 2018

Решение состоит в том, чтобы просто использовать .@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');
})

Вот фиксированный твиддл .

0 голосов
/ 22 ноября 2018

Я бы реализовал наблюдателя, который следит за массивом проекта.Внутри наблюдателя я бы разрешил сортировку массива проектов по принципу отношения пользователей.

Пожалуйста, ознакомьтесь со следующим фрагментом кода.

  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));
  })
...