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

Javascript 全局帮助器在HTML中调用时工作,而不是在JS中,javascript,meteor,helper,Javascript,Meteor,Helper,我有以下全局帮助程序: 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;

我有以下全局帮助程序:

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>
值得一提的是,
UI.\u globalHelpers
将Webstorm中的错误作为未解析变量

我认为问题可能是我没有向函数传递任何参数,但它可以通过HTML正常工作,因此不需要。另外,在
test
帮助程序中添加
console.log(this.\u id)
console.log(this.targetId)
都会返回正确的结果,因此这些结果都是有效的

使用下面的答案更正代码:

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.\u 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
helper,在JavaScript中使用
getResults
函数

你能粘贴错误吗?这是未定义的变量吗?语法UI.\u globalHelpers.results().peFy1很好,前提是调用时上下文有效(此.\u id已设置)。谢谢,我在上面添加了一些关于我在浏览器中看到的错误的详细信息。至于你的另一个问题,我不知道我是否明白。我提到的未定义变量是
UI.\u globalHelpers
本身,但我知道我不应该依赖webstor告诉我的。如果它在从HTML调用时起作用,我不确定为什么上下文调用与JS不同。还有什么我可以添加到这里进行故障排除的吗?在哪里定义了fixedDisplay?什么是toFixed?
fixedDisplay
只是一个助手,它使用
toFixed()
设置小数位数。回复:您对此的评论。\u id,也许我需要传入
valuationId
targetId
?无论如何都不起作用,但我不明白如果在
results
Correction中设置它们为什么会有必要:如果我将HTML简化为
{{results}}
,我实际上在浏览器中根本没有收到任何错误(
fixedDIsplay
把我甩了)。我知道这是一个非常基本的问题,但是你把
getResults
代码放在哪里?现在,我在
client/lib
文件夹中有
Template.registerHelper('results')
。我可以把新街区放在上面吗?谢谢。我已经一点一点地复制了这一点,但仍然没有得到值,现在也得到了
无法读取未定义的
错误的属性'ticker'。可能更多的是由于我的经验不足,需要深入研究一下,看看我是否能解决这个问题。谢谢,这很简单。它告诉您.ticker(即companys.findOne({u id:targetId}))左侧的表达式未定义。或者换句话说,在companys集合中没有具有该_id值的文档。我看到了,但它与我之前使用的表达式是相同的,实际上是有效的。文档就在那里。只是为了确保,添加我在上面编辑的两行额外内容(console.log行),并检查它是否记录了您所期望的内容。那个错误,是从回溯中的那一行抛出的吗?
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;
    }
});
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();
});