如何为 Ember 数据中的异步关联定义计算的 属性?

How to define a computed property for async associations in Ember data?

我在根据对象控制器中的一些异步关联定义计算 属性 时遇到问题。我的示例基于我在此处和 Ember 文档中找到的一些示例。

我有三个(相关)模型:一个 Space 和一个或多个 Subscription(s),每个模型都有一个 User。它们都已加载 async:

MyApp.Space = DS.Model.extend({
  name: DS.attr('string'),
  subscriptions: DS.hasMany('subscription', { inverse: 'space', async: true })
});

MyApp.Subscription = DS.Model.extend({
  space: DS.belongsTo('space', { inverse: 'subscriptions', async: true }),
  user: DS.belongsTo('user', { async: true })
});

MyApp.User = DS.Model.extend({
  name: DS.attr('string')
});

我尝试在 space 的控制器中计算一个 属性 mySubscription,它从 subscriptions 获取属于我的订阅,因为那是我的地方可以通过 mixin 访问当前用户(与此示例无关)。

MyApp.SpaceController = Ember.ObjectController.extend(
  MyApp.CurrentUserMixin, {

  mySubscription: function () {
    var me = this.get('currentUser');
    var subscriptions = this.get('model.subscriptions');
    return subscriptions.findBy('user', me);
  }.property('model.subscriptions.@each')
});

这个 属性 结果总是 undefined 但是我试了一下。我已经尝试将 .content 添加到所有异步内容中,我尝试通过 id 查找并调试和检查它的地狱。不知何故,我无法在关联对象数组中找到任何内容。有人知道我应该如何进行吗?

model.subscriptions returns 一个承诺,所以像下面这样的东西可能会起作用:

MyApp.SpaceController = Ember.ObjectController.extend(
  MyApp.CurrentUserMixin, {

  mySubscription: function () {
    var _this = this;
    return this.get('subscriptions').then(function (subscriptions) {
      return subscriptions.findBy('user', _this.get('currentUser'));
    });
  }.property('subscriptions.@each', 'currentUser')

});

model 被省略,因为您在 ObjectController 中)

正如 Dom 克里斯蒂指出的那样,问题确实是异步/同步不匹配。比在承诺的解决中返回更好的是设置一个 属性 与这样的观察者:

updateMySubscription: function () {
  var self = this;
  var subscriptions = this.get('subscriptions').then(function (subscriptions) {      
    var mySubscription = subscriptions.findBy('user', self.get('currentUser'));
    self.set('mySubscription', mySubscription);
  });
}.observes('subscriptions.@each')

这样 mySubscription 属性 本身就变成了正常同步 属性。