很难为这个问题找到一个好头衔......
错误
我遇到了一些导致错误的奇怪问题:
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
未定义!
我没有想法,会对一些建议感到高兴。
答案 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
模板助手实际上并不适合该功能;模板助手通常没有副作用,通常只由模板(或有时是其他助手)调用。