我在对象控制器中基于某些异步关联定义计算属性时遇到问题。我的例子基于我在这里和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
查找并调试并检查了它的内容。不知何故,我无法在关联对象数组中找到任何内容。有人知道我该怎么办吗?
答案 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
)