javascript - 将变量传递给 Meteor 助手

标签 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这解释了可重用代码,但不清楚是否适用相同的用例。我的变量指向数据库中的特定字段,不一定是计算。

有人可以帮我修复我的语法吗?我正在编写的代码比我目前的理解所需的代码要多几倍。谢谢。

编辑 我还尝试以与在帮助程序中声明变量相同的方式声明变量,但这些返回未定义

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>

最佳答案

您可能正在寻找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)

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

关于javascript - 将变量传递给 Meteor 助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33041898/

相关文章:

javascript - 在 MongoDB 中插入/更新插入嵌套文档

javascript - 将私有(private)变量转换为公共(public)变量

java - Guice 中的可选 Scoped 注入(inject)

javascript - 如何禁用 highcharts 仪表中的工具提示?

javascript - 从 href 链接获取值

javascript - 使用正则表达式以逗号分隔的 Rails 自动完成标签

javascript - meteor Kurourin 分页不起作用

javascript - Meteor仅发布: admin can view all data,用户的数据

javascript - 在 initComponent Ext JS4 中声明函数

javascript - 有没有办法防止 neDB 集合数组中的条目重复?