【问题标题】:Sort Ember Object Array with Promises使用 Promise 对 Ember 对象数组进行排序
【发布时间】:2018-11-22 01:56:13
【问题描述】:

我有一个模型 模特/人

{

  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
}

【问题讨论】:

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


    【解决方案1】:

    解决方法就是使用.@each:

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

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

    一个重要通知:你不能.@each.foo.bar。 这就是你在 twiddlemodel.@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.

    【讨论】:

    • 您的解决方案是我的第一次尝试,但它不起作用。请查看ember-twiddle.com/…也许你可以修复它
    • 我很乐意找到这样一个令人愉快的解决方案。
    • 感谢@Lux 的回答!这也对我有用!
    【解决方案2】:

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

    请查看以下代码 sn-p。

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

    【讨论】:

    • 感谢您的快速回复!很高兴地说它有效。我不清楚如何使用 promise 数组。使用这个例子它解决了。再次感谢你:)
    • 这是一个非常糟糕的主意!您应该从不使用观察者来设置 ember 状态。通常很少理由使用观察者而不是 CP。
    • @Thilina Dinith Fonseka。请查看 Lux 的答案。他的解决方案是 ember 应该如何,要好得多。请不要接受这个答案。
    • @asdf 谢谢。我接受了你的回答,因为它对我有用。我也会尝试 lux 答案。
    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多