【问题标题】:Meteor handlebars {{#if}} turns strings into objectsMeteor 车把 {{#if}} 将字符串变成对象
【发布时间】:2013-11-15 10:43:58
【问题描述】:

The bug source code is here.

假设我在 Meteor 中使用普通的 {{#each}} 循环遍历一个数组。每个数组元素都是一个字符串,我在每一步都使用{{this}} 输出字符串。到目前为止,一切都很好!如果我使用车把助手检查typeof 是否有this,我会得到string。甜的!一切都应该如此。

但是如果我在{{#each}} 中添加一个{{#if something }}-helper(something 只是返回 true,因此会继续输出{{this}}),该字符串在 HTML 中仍然看起来不错,但现在是object 中的 typeof 检查!

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

我做错了吗?

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

如果是这样:是 Meteor 特有的还是 Handlebars 特有的错误?

谢谢!

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

【问题讨论】:

    标签: meteor handlebars.js


    【解决方案1】:

    这是因为 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

    【讨论】:

    • 干杯,很好的答案!
    • 在比较字符串的情况下可以使用的另一种解决方法:_.isEqual(this, stringToCompareAgainst)。还要注意 Template.currentData() 返回一个字符串而不是 Object
    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 2012-09-16
    • 1970-01-01
    • 2016-02-16
    • 2013-11-21
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多