Сортировка массива объектов 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}),

}

затем я извлекаю все проекты в виде массива, содержащего объекты Ember. так как проект -> пользователи асинхронны, это обещание. и я хочу отсортировать этот массив, используя имя человека. когда данные поступают соответственно и повторно отображают hbs, использующие список

у меня есть вычисляемое свойство, называемое

renderProjects = computed ('model.projects.[]')
{
 // trying to sort in here but data is not avaiable so its not getting sorted
}

person Thilina Dinith Fonseka    schedule 22.11.2018    source источник


Ответы (2)


Решение состоит в том, чтобы просто использовать .@each:

renderProjects: computed ('[email protected]', function() {
  return this.users.sortBy('firstName');
})

это будет пересчитывать renderProjects CP при каждом изменении списка проектов или любых изменений firstName в любом из проектов, а затем автоматически обновлять ваше представление.

Одно важное замечание: вы не можете сделать [email protected]. Это то, что вы делали в своем твидле с [email protected].

В вашем твидле самое простое решение - добавить computed.alias к модели video:

username: computed.alias('myUser.name'),

Тогда вы можете сделать это:

sortedVideos: computed('[email protected]', function() {
  return this.get('model').sortBy('username');
})

Это фиксированный поворот.

person Lux    schedule 22.11.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));
  })
person wuarmin    schedule 22.11.2018
comment
Спасибо за быстрый ответ ! рад сказать, что это сработало. мне было не ясно, как использовать для этого массив обещаний. используя этот пример, он разрешился. Еще раз спасибо :) - person Thilina Dinith Fonseka; 22.11.2018
comment
это действительно плохая идея! вы не должны никогда использовать наблюдателей для установки состояния горения. Обычно очень мало причин использовать наблюдателей вместо CP. - person Lux; 22.11.2018
comment
@Тилина Динит Фонсека. Пожалуйста, ознакомьтесь с ответом Люкс. Его решение такое, каким оно должно быть в Ember, намного лучше. Пожалуйста, отмените этот ответ. - person wuarmin; 23.11.2018
comment
@asdf спасибо. я принял ваш ответ, потому что это сработало для меня. Я тоже попробую люксовый ответ. - person Thilina Dinith Fonseka; 26.11.2018