我有一个计算属性,我试图创建一个记录,如果一个记录不存在,但在尝试渲染计算属性时不断获得jQuery.Deferred exception
。
这是我到目前为止所拥有的:
deadlineDay: computed(function() {
const oneWeekFromNow = moment().startOf('day').add(1, 'week');
const store = this.get('store');
return store.queryRecord('deadline-day', {
filter: {
date: oneWeekFromNow
}
}).then(result => {
if (!result) {
result = store.createRecord('deadline-day', {
date: oneWeekFromNow
});
result.save();
}
return result;
});
}),
然后在我的模板中,我试图用简单的帮助器进行渲染:
{{display-date deadlineDay.date}}
{{display-date}}
助手只需拨打return date.format('dddd, MMM Do')
看起来Ember试图自己渲染承诺,而不是等待它解决。
这会导致错误,因为.format
不是承诺的方法。
我认为这是一个非常常见的用例,但我理解失败了。非常感谢!
我不确定它是否相关,但我的后备商店是通过ember-local-storage
的sessionStorage答案 0 :(得分:1)
我同意Ember可能会试图兑现承诺,而不是等待承诺解决。不幸的是,我目前无法重现错误。
在Ember.js中,通常建议在路径文件中放置数据调用。这将允许您的查询/保存和所有其他数据收集在加载模板文件之前进行。您描绘的计算属性显示没有依赖键,因此这可能证明将调用移动到您的方案的路由文件。
generic route.js例子:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
//////// make shadow of total view
self.clipsToBounds = NO;
self.layer.masksToBounds = NO;
self.layer.shadowRadius = 5;
self.layer.shadowOpacity = 0.5;
self.layer.shadowColor = [UIColor blackColor].CGColor;
self.layer.shadowOffset = CGSizeMake(0, 1);
self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
// make radius of the cell
self.layer.cornerRadius = 5;
}
return self;
}
但是,如果计算属性中的承诺有用,则Ember Igniter的作者可能会有一些额外的有用指导,这些指导可能是值得的。 The Guide to Promises in Computed Properties