全局助手在 HTML 中调用时工作,而不是在 JS 中

Global helper works when called in HTML, not in JS

我有以下全局助手:

Template.registerHelper('results',function(){
    var valuationId = this._id;
    var valuation = Valuations.findOne({_id: valuationId});
    var targetId = this.targetId;
    var targetTicker = Companies.findOne({_id:targetId}).ticker;
    var targetData = CompaniesData.findOne({ticker: targetTicker});
        return {
            peFy1: targetData.epsFy1 * valuation.PriceEarningsFy1,
            peFy2: targetData.epsFy2 * valuation.priceEarningsFy2
            }
});

当我通过 HTML 调用这个助手时,就像这样,它工作正常:

<div>
    {{results.peFy1}}
</div>

通过Javascript、.

调用助手时无法显示值
<div>
    {{peFy1}}
</div>

Template.ValuationResults.helpers({
    peFy1: function() {
        return UI._globalHelpers.results().peFy1;
    }
});

我试过用其他几种方式写这篇文章,但 none 有效:

return UI._globalHelpers['results']().peFy1;
return Template._globalHelpers.results().peFy1;

就其价值而言,UI._globalHelpers 在 Webstorm 中给出了一个错误,因为它是未解析的变量。

我认为问题可能是我没有将任何参数传递给该函数,但它通过 HTML 工作正常,因此没有必要。此外,在 test 帮助程序中添加 console.log(this._id)console.log(this.targetId) 都 return 正确的结果,因此它们是有效的。

使用以下答案的正确代码:

getResults = function(valuationId,targetId){
    var valuation = Valuations.findOne({_id: valuationId});
    var targetTicker = Companies.findOne({_id:targetId}).ticker;
    var targetData = CompaniesData.findOne({ticker: targetTicker});
    return {
        peFy1: targetData.epsFy1 * valuation.priceEarningsFy1,
        peFy2: targetData.epsFy2 * valuation.priceEarningsFy2
    }
};
Template.registerHelper('results',function(){
    return getResults();
});

Template.Valuation.helpers({
    peFy1: function() {
        var valuationId = this._id;
        var targetId = this.targetId;
        return getResults(valuationId,targetId).peFy1;
    },
    peFy1: function() {
        var valuationId = this._id;
        var targetId = this.targetId;
        return getResults(valuationId,targetId).peFy1;
    }
});

您对 UI._globalHelpers.results().peFy1 的使用在语法上看起来是正确的。

然而,作为避开 Meteor (UI._globalHelpers) api 的替代选项,创建一个标准的 JavaScript 函数,如下所示:

getResults = function(){
  var valuationId = this._id;
  var valuation = Valuations.findOne({_id: valuationId});
  var targetId = this.targetId;
  var targetTicker =     Companies.findOne({_id:targetId}).ticker;
  console.log('targetId: ' + targetId);
  console.log(Companies.findOne({_id:targetId})),
  var targetData = CompaniesData.findOne({ticker: targetTicker});
  return {
        peFy1: targetData.epsFy1 * valuation.PriceEarningsFy1,
        peFy2: targetData.epsFy2 * valuation.priceEarningsFy2
        }
};
Template.registerHelper('results',function(){
  return getResults();
});

在模板中使用 results 助手,在 JavaScript 中使用 getResults 函数。