如何为 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
属性 本身就变成了正常同步 属性。
我在根据对象控制器中的一些异步关联定义计算 属性 时遇到问题。我的示例基于我在此处和 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
属性 本身就变成了正常同步 属性。