【问题标题】:Passing variables into Meteor helpers将变量传递给 Meteor 助手
【发布时间】: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>

【问题讨论】:

  • 你永远不会调用你的函数,priceepsFy1 不会返回任何东西,这使得它们实际上毫无用处。
  • 如果我声明没有函数怎么办,就像上面的编辑一样?这就是我在助手中声明变量的方式,可以将其分解并重用吗?

标签: javascript meteor scope


【解决方案1】:

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

priceEarningsFy1 函数为例:

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

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

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

【讨论】:

  • 我已经将全局帮助器用于其他目的,我会试一试。但这不会弄乱 HTML 代码吗?我有一些依赖 5 或 6 个变量的助手。我现在也不打算跨模板重用。如果一个模板中的所有助手都能够依赖同一个变量,我会很高兴。
  • 另外,在您的示例中,company 仍然是从全局帮助程序声明的。当我编写 priceEarningsFy2 全局助手时,我需要再次声明它,不幸的是,这让我回到了开始的地方。
  • 它不会使 HTML 代码混乱,因为它是 js。它也不会弄乱 js,因为您需要在 somewhere 中创建这些函数。 company 是一个临时变量,其范围仅限于该函数。您不能在帮助程序范围之外定义compticker,因为this 将指向window,而不是帮助程序的数据上下文。您还可以在一个对象中返回多个 FY P/E 值并在模板中使用它们。
  • 谢谢。我会花一些时间在这上面。我所说的“使 HTML 混乱”是指你在哪里使用 {{priceEarningsFy1 this.ticker}}。在其他情况下,我需要添加多个全局助手。但我只是在猜测,直到我尝试实现这一点。感谢您关于无法在帮助程序范围之外定义 compTicker 的观点,我一直在寻找对此的确认。
  • 还有。要返回多个 FY P/E 值,我假设您的意思是我可以定义一个名为 priceEarnings 的全局帮助器,然后在其中运行 if 语句来更改周期?
猜你喜欢
  • 2015-09-30
  • 2018-07-23
  • 2015-09-02
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
相关资源
最近更新 更多