按承诺对Ember对象数组进行排序

时间:2018-11-22 01:56:14

标签: javascript ember.js ember-data ember-controllers

我有一个模特 模特/人

{

  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
}

2 个答案:

答案 0 :(得分:3)

解决方案只是使用.@each

renderProjects: computed ('model.projects.@each.firstName', function() {
  return this.users.sortBy('firstName');
})

这将在项目列表更改或任何项目上的任何renderProjects更改时重新计算firstName CP,然后自动更新视图。

一个重要的提示:您不能.@each.foo.bar。 这就是您在twiddle中用model.@each.myUser.name做的事情。

最简单的解决方法是在computed.alias模型中添加一个video

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

然后您可以执行以下操作:

sortedVideos: computed('model.@each.username', function() {
  return this.get('model').sortBy('username');
})

Here is a fixed twiddle

答案 1 :(得分:0)

我将实现一个观察者,它监视项目数组。在观察者内部,我将解析用户关系,随后对项目数组进行排序。

请查看以下代码段。

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