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

时间:2015-02-19 13:02:12

标签: asynchronous ember.js 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')
});

我尝试计算一个属性mySubscription,该属性从subscriptions获取属于我的订阅,位于空间的控制器中,因为这是我通过{{{{{{{{{ 1}}(与此示例无关)。

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查找并调试并检查了它的内容。不知何故,我无法在关联对象数组中找到任何内容。有人知道我该怎么办吗?

2 个答案:

答案 0 :(得分:2)

正如Dom Christie指出的那样,确实存在异步/同步不匹配问题。在解决诺言的过程中,最好的回答是用这样的观察者设置一个属性:

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属性本身就成为普通的同步属性。

答案 1 :(得分:0)

model.subscriptions会返回一个承诺,因此以下内容可能有效:

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')

});

(因为你在ObjectController中,所以省略model