[英]Passing variables into Meteor helpers
我正在努力解决与变量声明有关的非常基本的问题。 我已经阅读了所有可以在变量上找到的内容,但是我不知道我的问题是否与1)我如何声明变量或2)如何设置变量的范围有关。
首先,我对Meteor中的变量的理解是,如果我使用var
,那么我将设置文件作用域,这将使该变量可用于该特定模板的每个助手。 如果我不使用var
,它将是全局的,因此每个模板中的助手都可以使用。 那是对的吗?
以下代码块可以正常工作,并在客户端中返回正确的值:
Template.CompanyFinancials.helpers({
priceEarningsFy1: function () {
var compTicker = this.ticker
var price = Companies.findOne({ticker: compTicker}).capTable.lastClose;
var epsFy1 = Companies.findOne({ticker: compTicker}).fy1.eps;
return (price / epsFy1).toFixed(1)
});
在这个应用程序中,我有数十种类似的计算方法,其中许多依赖于比本示例更多的变量,因此,我一直试图将这些变量分解出来,并在模板中重用它们,如下所示:
var compTicker = function() {
return this.ticker;
};
console.log(compTicker);
var price = function(compTicker) {
Companies.findOne({ticker: compTicker}).capTable.lastClose;
};
console.log(price);
var epsFy1 = function(compTicker) {
Companies.findOne({ticker: compTicker}).fy1.eps;
};
console.log(epsFy1);
Template.CompanyFinancials.helpers({
priceEarningsFy1: function (price, epsFy1) {
return (price / epsFy1).toFixed(1)
}
});
使用此代码,console.log()实际上为每个变量而不是值return this.ticker
每个函数内的文本(例如, return this.ticker
)。 如果我声明的变量没有函数,就像我在助手中所做的那样,它将为compTicker
返回undefined。
我试图遵循这个解释可重复使用代码的答案 ,但是不清楚是否适用相同的用例。 我的变量指向数据库中的特定字段,而不一定指向计算。
谁能帮我修复我的语法? 就目前的理解而言,我编写的代码要多于所需的倍数。 谢谢。
编辑我也尝试过用在帮助器中声明变量的方式声明变量,但是这些变量返回undefined
。
var compTicker = this.ticker;
console.log(compTicker);
var price = CompaniesFeed.findOne({ticker: this.ticker}).capTable.lastClose;
console.log(price);
var epsFy1 = CompaniesFeed.findOne({ticker: this.ticker}).fy1.eps;
console.log(epsFy1);
解决方案:使用全局帮助器并返回多个值,然后使用点表示法访问模板HTML:
Template.registerHelper('priceEarnings',function(){
var ticker = this.ticker;
var company = CompaniesFeed.findOne({ticker: ticker});
return {
peFy1: (company.capTable.lastClose / company.financial.fy1.eps).toFixed(1),
peFy2: (company.capTable.lastClose / company.financial.fy2.eps).toFixed(1)
};
});
<td>{{priceEarnings.peFy1}}x</td>
您可能正在寻找全球性的帮手 。 这些是可以在所有模板中重复使用的助手。
以您的priceEarningsFy1
函数为例:
Template.registerHelper('priceEarningsFy1',ticker => {
const company = Companies.findOne({ticker: ticker});
return ( company.capTable.lastClose / company.fy1.eps ).toFixed(1);
});
在这种情况下,我已指定将ticker
作为参数提供。 例如,在{{priceEarningsFy1 this.ticker}}
模板中,您可以使用{{priceEarningsFy1 this.ticker}}
。 要从js代码引用此函数,请使用UI._globalHelpers.priceEarningsFy1(ticker)
请注意,您在给定文件内定义的任何本地函数都可用于同一文件内的任何其他函数。 我的模式是将所有全局助手放在一个按名称排序的文件中,然后在底部添加各种实用程序函数供全局助手使用。 这使东西相对脱水。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.