如果我在promise上有then()函数,它永远不会通过计算属性
正确解析所以这没关系,
taxRate: computed(function() {
return this.get('store').findRecord('tax-rate', { current: true });
})
但这不是,(输出[object Object]
- 承诺 - 在htmlbars模板中)
taxRateValue: computed(function() {
return this.get('store').findRecord('tax-rate', { current: true }).then((taxRate) => {
return taxRate.get('taxRateValue');
})
})
那么在不使用观察者的情况下处理此问题的正确方法是什么?
答案 0 :(得分:0)
第一个有效,因为Ember Data在内部使用capabilities
。内部工作有点棘手,但它的要点是当它的承诺结算时,对象会激活观察者。第二个不起作用,因为你不再返回一个实现Ember对象系统的对象,你只是返回一个promise。模板不知道如何处理promise,这就是对象逻辑中的所有内容。至于你的问题:
那么在不使用观察者的情况下处理此的正确方法是什么?
我担心这是不可能的。您将需要直接或间接使用某种观察者某处。我建议直接使用一个来明确发生了什么:
taxRateValue: null,
taxRateValuePromise: observes('someProperty?', function() {
this.get('store').findRecord('tax-rate', { current: true }).then((taxRate) => {
this.set('taxRateValue', taxRate.get('taxRateValue'));
})
}),
您也可以重用PromiseObject,但这需要您使用对象而不是值:
taxRateValue: computed(function() {
return DS.PromiseObject.create({
promise: this.get('store').findRecord('tax-rate', { current: true }).then((taxRate) => {
return taxRate.get('taxRateValue');
})
});
})
然后在你的模板中:
{{taxRateValue.content}}
答案 1 :(得分:0)
与商店的通信应该在可以做的路线内进行
setupController(controller, model) {
var promise = this.get('store').findRecord('tax-rate', { current: true })
.then(taxRate => taxRate.get('taxRateValue'))
.then(taxRateValue => controller.set('taxRateValue', taxRateValue)); //pass actual value
controller.set('taxRateValue', promise); //pass promise to template to display loader
}