Ember 2.17
我正在从模板中调用帮助程序:
{{#each invoice.invoiceLines as |line| }}
{{pricings/full-pricing line.pricing}}
{{/each}}
invoice
,invoiceLine
和pricing
都是余烬模型。
以下是在模型()中创建发票的方式:
model(params) {
let invoice= this.store.findRecord('invoice',params.invoice_id)
return Ember.RSVP.hash({
invoice: invoice,
allShares: invoice.then((i)=>{return i.allShares()}),
detailShares: invoice.then((i)=>{return i.detailShares()})
});
}
帮助者的目标是获取价格,提取数字(模型中的所有内容,不再有任何关系)并返回一个格式化初始价格和订阅价格的字符串。 助手如下:
import { helper } from '@ember/component/helper';
export function pricingsFullPricing([pricing]) {
return pricing.then(
p=>{
debugger
},p=>{
}
)
}
export default helper(pricingsFullPricing);
运行页面时,调试器被调用两次(模板循环运行一次)。
第一次p为空,第二次为定价。
then
是否应该防止这种情况发生?为什么会这样呢?
答案 0 :(得分:2)
您的路线是错误的,路线具有诺言意识(这就是hash
的意思),应该是:
model(params) {
return Ember.RSVP.hash({
invoice: this.store.findRecord('invoice',params.invoice_id)
//allShares: invoice.then((i)=>{return i.allShares()}),
//detailShares: invoice.then((i)=>{return i.detailShares()})
});
}
那么您的把手就是:
{{#each model.invoice.invoiceLines as |line| }}
{{line}}
{{/each}}
您也不应该像在模型上那样调用方法。目前尚不清楚allShares()
等的作用,但是在 controller 中应该(可能)是computed
。类似于:
import { computed } from '@ember/object';
export default Controller.extend({
allShares:computed('model.invoice', function(){
return this.get('model.invoice').allShares();
});
});
尽管这似乎并不理想。就像我说的那样,很难弄清楚,因为不清楚您要在这里做什么。如果您将这些方法提取到service 中,可能会更有意义。
然后您根本不需要帮助程序。这似乎只是在兑现承诺。
如果您尝试在加载前将所有服务器端数据加载到route
中,则会使工作变得更加轻松
答案 1 :(得分:2)
帮手的首要规则
每当更改辅助输入时,都会再次调用计算功能。
第二,关于帮助程序的任何事情都不会阻止此后续调用,因为您正在返回承诺。
export function pricingsFullPricing([pricing]) {
return pricing.then(
p=>{
debugger
},p=>{
}
)
}
您在此处创建了一个简单的帮助程序,它将使用promise本身作为值。查看ember-promise-helpers/await,了解如何使用class based helper手动设置模板中显示的值。
现在,如果您想知道为什么要进行重新计算,我将不得不基于自己对Ember数据的了解而推测出自己是否只是Ember社区的一员(我从未真正使用过Ember Data )。您知道line.pricing
是一个承诺吗?然后,我可以假设您使用的是某种关系,很可能必须通过ajax调用来加载(因此,promise)。但是Ember数据iirc中的这些关系使用此PromiseProxyMixin,使它们能够像承诺或对象一样同时运行(取决于数据是否已存储)。这样一来,您无需then
请参阅此article,以更好地理解我的意思