流星把手{{#if}}将字符串转换为对象

时间:2013-11-14 16:15:25

标签: meteor handlebars.js

The bug source code is here

假设我使用普通的{{#each}}循环在Meteor中循环数组。每个数组元素都是一个字符串,我使用{{this}}每一步输出字符串。到现在为止还挺好!如果我使用把手帮助器检查typeof this我将获得string。甜!一切都是应有的。

但是如果我在{{#if something }}内添加一个{{#each}} - 帮助器(something只返回true,从而继续运行并输出{{this}})字符串看起来仍然很好在HTML中,但它现在是object检查中的typeof

这非常烦人,因为我的代码现在可能依赖的所有(typeof someVarINeedToTest === 'string')都将返回false。

我做错了吗?

或者这是一个真正的错误吗?

如果是这样的话:它是特定于Meteor或Handlebars的错误吗?

谢谢!

哦:the source link again。只需拉动并运行meteor,然后查看浏览器控制台。

1 个答案:

答案 0 :(得分:5)

这是因为this变量应始终是JavaScript中的对象,因此当手柄调用someFunction.apply(someContext);时,JavaScript会将someContext转换为对象,无论它是什么开始如。请在此处查看示例:http://jsfiddle.net/SyKSE/1/

(在这种情况下,someFunction表示模板中{{#if}}语句中的部分。)

一个简单的(虽然很丑陋)解决方法是始终将您的数据作为对象传递,所以

['this', 'is', 'an', 'array', 'that', 'we\'re', 'looping', 'through'];

变为:

[{val: 'this'}, {val: 'is'}, {val: 'an'}, {val: 'array'}, {val: 'that'}, {val: 'we\'re'}, {val: 'looping'}, {val: 'through'}];

然后您需要更改模板以查看val而不是this