即使它应该是模板助手还没准备好

时间:2014-05-26 09:51:53

标签: javascript highcharts meteor

很难为这个问题找到一个好头衔......

错误

我遇到了一些导致错误的奇怪问题:

Uncaught TypeError: Object #<Component> has no method 'someHelper'

即使我明确检查了模板助手&#39; someHelper&#39;做好准备。奇怪的是,当流星由于代码更改而重新启动时,此发生(如果我停止并且手动启动流星,则)。错误恰好发生一次,如果我刷新页面,一切都按预期工作。我在Chrome和Firefox中测试过同样的行为。

代码

让我解释一下(下面的所有代码都在 client.js 中):

我有一些绘图代码需要模板someTemplate中的div才能将图表呈现给(Highcharts API)。绘图在模板助手Template.someTemplate.someHelper()中完成。

剧情应该被动地更新,所以我有类似的东西

Deps.autorun(function () {
  // ... some code

  // I am expecting the template not to be ready so I use a session variable to check
  if (Session.get("someTemplateRendered")){
    // The check above should be sufficient but after experiencing the error I added an
    // additional check
    if (typeof Template.someTemplate.someHelper != undefined){ 
      Template.historychart.someHelper(); // this is the line with the error (sometimes)
    }
  }
});

要设置会话变量:

Template.someTemplate.rendered = function() {
  Session.set("someTemplateRendered", true);
  // (nothing else in this rendered callback)
};

更奇怪的是,如果我在发生错误的行中暂停执行并执行

typeof Template.someTemplate.someHelper
在JS控制台中我得到了"undefined"

这怎么可能?我明确地检查Template.someTemplate.someHelper未定义!

我没有想法,会对一些建议感到高兴。

1 个答案:

答案 0 :(得分:2)

未定义typeof blah的{​​{1}}的返回值是字符串blah,而不是值"undefined"。事实证明undefined是假的。

undefined == "undefined"

顺便说一下,会话变量是通过热代码重新加载来保留的,所以在HCR之后,即使// in a Javascript console, where there is no variable 'qwerty' typeof qwerty != undefined // > true typeof qwerty != "undefined" // > false 还没有呈现,Session.get("someTemplateRendered")仍然是真的,只要它在之前呈现HCR。这就是为什么当页面由于HCR重新加载时自动运行会立即触发的原因。

一个问题:为什么甚至打扰Session变量和自动运行?这有什么问题?

someTemplate

模板助手实际上并不适合该功能;模板助手通常没有副作用,通常只由模板(或有时是其他助手)调用。