将变量传递给Meteor助手

时间:2015-10-09 15:19:07

标签: javascript meteor scope

我正在努力解决与变量声明相关的非常基本的问题。我已经阅读了关于变量的所有内容,但我不知道我的问题是否与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来解释可重复使用的代码,但不清楚相同的用例是否适用。我的变量指向数据库中的特定字段,不一定是计算。

任何人都可以帮我修复语法吗?根据我目前的理解,我写的代码多于我需要的代码。谢谢。

EDIT 我也尝试使用与帮助器中声明的变量相同的方式声明变量,但这些变量返回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>

1 个答案:

答案 0 :(得分:1)

您可能正在寻找global helpers。这些是可以在所有模板中重复使用的帮助程序。

对于您的priceEarningsFy1功能,例如:

Template.registerHelper('priceEarningsFy1',ticker => {
  const company = Companies.findOne({ticker: ticker});
  return ( company.capTable.lastClose / company.fy1.eps ).toFixed(1);
});

在这种情况下,我已指定将ticker作为参数提供。从火焰模板中,您可以使用{{priceEarningsFy1 this.ticker}}。要从js代码引用此函数,请使用UI._globalHelpers.priceEarningsFy1(ticker)

请注意,您在给定文件中定义的任何本地函数都可用于同一文件中的任何其他函数。我的模式是将所有全局帮助器放在一个按名称排序的文件中,然后在底部添加各种实用程序函数供全局帮助程序使用。这使事情相对脱水。