Javascript 然后()在应该挂起时返回空值
余烬2.17 我正在从模板中调用帮助程序:Javascript 然后()在应该挂起时返回空值,javascript,ember.js,promise,ember-data,Javascript,Ember.js,Promise,Ember Data,余烬2.17 我正在从模板中调用帮助程序: {{#each invoice.invoiceLines as |line| }} {{pricings/full-pricing line.pricing}} {{/each}} 发票,发票行,以及定价都是余烬车型 以下是如何在模型()中创建发票: 助手的目标是获取定价,提取数字(所有内容都在模型中,没有其他关系),并返回一个字符串,格式化初始价格和订阅价格。 助手如下所示: import { helper } from '@ember/com
{{#each invoice.invoiceLines as |line| }}
{{pricings/full-pricing line.pricing}}
{{/each}}
发票
,发票行
,以及定价
都是余烬车型
以下是如何在模型()中创建发票:
助手的目标是获取定价,提取数字(所有内容都在模型中,没有其他关系),并返回一个字符串,格式化初始价格和订阅价格。
助手如下所示:
import { helper } from '@ember/component/helper';
export function pricingsFullPricing([pricing]) {
return pricing.then(
p=>{
debugger
},p=>{
}
)
}
export default helper(pricingsFullPricing);
当我运行页面时,调试器被调用两次(模板循环运行一次)
第一次p为空,第二次为定价
难道
不应该阻止这种情况吗?为什么会这样呢?您的路由是错误的,路由是承诺感知的(这就是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()
,etc做了什么,但是这些应该(可能)在控制器中进行计算。大致如下:
import { computed } from '@ember/object';
export default Controller.extend({
allShares:computed('model.invoice', function(){
return this.get('model.invoice').allShares();
});
});
虽然这看起来并不理想。就像我说的,很难明确,因为不清楚你想在这里做什么。如果您的将这些方法提取到一个中,可能更有意义
这样,您就根本不需要助手了。这似乎只是试图绕过承诺
如果您尝试在加载之前加载路由中的所有服务器端数据,您的路由是错误的,路由是承诺感知的(这就是散列
的用途),它应该是:
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()
,etc做了什么,但是这些应该(可能)在控制器中进行计算。大致如下:
import { computed } from '@ember/object';
export default Controller.extend({
allShares:computed('model.invoice', function(){
return this.get('model.invoice').allShares();
});
});
虽然这看起来并不理想。就像我说的,很难明确,因为不清楚你想在这里做什么。如果您的将这些方法提取到一个中,可能更有意义
这样,您就根本不需要助手了。这似乎只是试图绕过承诺
如果您在加载之前尝试加载路由中的所有服务器端数据,则会使工作变得更加轻松。帮助程序的第一条规则
每当助手的输入发生变化时,将再次调用compute函数
第二,帮助者不会阻止后续呼叫,因为您正在返回一个承诺
export function pricingsFullPricing([pricing]) {
return pricing.then(
p=>{
debugger
},p=>{
}
)
}
您已经在这里创建了一个简单的助手,它将使用承诺本身作为值。查看以了解如何使用手动设置模板中显示的值
现在,如果你想知道为什么会发生重新计算,我将不得不根据我作为余烬社区的一部分对余烬数据的了解进行推测(我从未实际使用过余烬数据)。你知道,定价是一种承诺吗?然后我可以假设您使用某种关系,这种关系很可能必须通过ajax调用加载(因此承诺)。但Ember data(iirc)中的这些关系使用它,允许它们像承诺或对象一样同时行为(取决于数据是否已经在存储中)。这允许您在模板中引用承诺,而无需then
请参见此,以更好地理解我的意思
每当助手的输入发生变化时,将再次调用compute函数
第二,帮助者不会阻止后续呼叫,因为您正在返回一个承诺
export function pricingsFullPricing([pricing]) {
return pricing.then(
p=>{
debugger
},p=>{
}
)
}
您已经在这里创建了一个简单的助手,它将使用承诺本身作为值。查看以了解如何使用手动设置模板中显示的值
现在,如果你想知道为什么会发生重新计算,我将不得不根据我作为余烬社区的一部分对余烬数据的了解进行推测(我从未实际使用过余烬数据)。你知道,定价是一种承诺吗?然后我可以假设您使用某种关系,这种关系很可能必须通过ajax调用加载(因此承诺)。但Ember data(iirc)中的这些关系使用它,允许它们像承诺或对象一样同时行为(取决于数据是否已经在存储中)。这允许您在模板中引用承诺,而无需then
请参阅本文,以更好地理解我的意思您的助手的文件位置是什么?helpers/pricings/full-pricing.js发票.发票行的价值是什么
?在循环之前,你能把{{log invoice.invoiceLines}}和{{{debugger}}放在模板中吗?invoice.inlines的日志:嗯,我不知道这是什么--你能用这个吗?然后在等待后使用更常规的对象?您的助手的文件位置是什么?helpers/pricings/full-pricing.js发票.invoice行的值是多少?在循环之前,你能把{{log invoice.invoiceLines}}和{{{debugger}}放在模板中吗?invoice.inlines的日志:嗯,我不知道这是什么--你能用这个吗?然后在等待之后使用更规则的对象?共享函数与我的问题无关,但感谢您的输入。自定义模型函数用于检索与模型相关的表格数据。我最终将它们显示在表格中。@Syl但您以这种方式构建路由的全部原因都是因为共享函数。最终,这就是导致此问题的设计决策。这本质上是一个问题,当我得到null
时,它解决了散列