2013-11-14 39 views
5

The bug source code is here流星把手{{#if}}将字符串变成对象

假设我正在使用普通的{{#each}}循环遍历Meteor中的数组。每个数组元素都是一个字符串,并且我使用{{this}}每一步输出字符串。到现在为止还挺好!如果我使用车把帮手来检查typeofthis我会得到string。甜!一切都是应该的。

但是,如果我添加了{{#each}}内的{{#if something }} -helper(在something刚刚返回true,从而保持持续输出{{this}})的字符串仍然看好在HTML,但它现在的objecttypeof检查!

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

我做错了什么?

或者这是一个实际的错误?

如果是这样:它是流星特定的还是特定于Handlebars的错误?

谢谢!

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

回答

5

这是因为this变量应该始终是JavaScript中的一个对象,所以当被handlebars调用时,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

+1

干杯,很好的答案! –

+0

感谢 - 做一个易于使用的测试用例的不错工作:) –

+0

另一个可以在比较字符串的情况下使用的解决方法:_.isEqual(this,stringToCompareAgainst)。另请注意,Template.currentData()返回一个字符串,而不是一个Object – JobJob