我的Meteor应用程序在FireFox上运行时出现此错误4次,第四次必须崩溃,因为此函数在整个html模板中被调用了大约30次。;
"Exception in template helper: @http://www.scr9.com:3000 /onepage.js?6b34dec0cc55de19e1c0ff682ac83dd9dce574d6:57:2
bindDataContext/<@http://www.scr9.com:3000/packages /blaze.js?efa68f65e67544b5a05509804bf97e2c91ce75eb:2727:14
Blaze._wrapCatchingExceptions/<@http://www.scr9.com:3000/packages/blaze.js?efa68f65e67544b5a05509804bf97e2c91ce75eb:1606:14
Spacebars.call@http://www.scr9.com:3000/packages/spacebars.js?7f53771c84a2eafac2b561c9796dda0d8af8e7f5:171:12
Spacebars.mustacheImpl@http://www.scr9.com:3000/packages/spacebars.js?7f53771c84a2eafac2b561c9796dda0d8af8e7f5:108:10
Spacebars.mustache@http://www.scr9.com:3000/packages/spacebars.js?7f53771c84a2eafac2b561c9796dda0d8af8e7f5:112:16
Template.writeInvoice</</</<.value@http://www.scr9.com:3000/template.onepage.js?0b87a7326f8eda037de95427f14c078c4ab026ac:1005:18
Blaze._withCurrentView@http://www.scr9.com:3000/packages/blaze.js?efa68f65e67544b5a05509804bf97e2c91ce75eb:2043:12
.visitAttribute@http://www.scr9.com:3000/packages/blaze.js?efa68f65"[…]
使用Chrome,IE和Safari正常工作。这是它在第57行引用的函数;
Handlebars.registerHelper("formatMoney", function(str) {
console.log(str); // reports 0 in Chrome, IE, Safari. undefined in FF
if (typeof str == "string")
{
str = Number(str); // line 57
}
str = str.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");
if (str == "0.00")
{
return "0.00";
} else {
return "$"+str;
}
});
当它第一次启动时我还没有数据,所以函数只是接收str = 0.想知道FF中可能会发生什么?
答案 0 :(得分:1)
这可能是因为有两件事:
首先,正则表达式,特别是使用/g
可能会导致错误,而不进行任何测试,我敢打赌这是问题所在。
其次,你在这里进行了很多强制攻击,所以首先,我将str
参数强制为一个数字,然后再将其传递给函数。如果这是来自您的数据库,这应该很容易,因为您在数据进入之前对数据进行了清理,对吧? 正确?
实施&amp;你的新功能如下:
Template.registerHelper("formatMoney", function(str) {
var formatOpts = {style: "currency", currency: "USD"};
return str ? str.toLocaleString("en-US", formatOpts ) : "0.00";
});