【发布时间】:2016-01-07 14:48:08
【问题描述】:
我正在努力解决我所知道的与变量声明相关的一个非常基本的问题。我已经阅读了关于变量的所有内容,但我不知道我的问题是否与 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),而不是值。如果我在没有函数的情况下声明变量,就像我在帮助程序中所做的那样,它会为 compTicker 返回 undefined。
我尝试关注this answer,它解释了可重用代码,但不清楚是否适用相同的用例。我的变量指向数据库中的特定字段,不一定是计算。
谁能帮我修复我的语法?以我目前的理解,我正在编写比我需要的多倍的代码。谢谢。
编辑
我还尝试以与在帮助程序中声明相同的方式声明变量,但这些返回 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>
【问题讨论】:
-
你永远不会调用你的函数,
price和epsFy1不会返回任何东西,这使得它们实际上毫无用处。 -
如果我声明没有函数怎么办,就像上面的编辑一样?这就是我在助手中声明变量的方式,可以将其分解并重用吗?
标签: javascript meteor scope