“this”似乎在车把“每个”助手中的旧迭代中具有价值(在 mandrill 模板中使用)

Posted

技术标签:

【中文标题】“this”似乎在车把“每个”助手中的旧迭代中具有价值(在 mandrill 模板中使用)【英文标题】:"this" seems to have value from old iteration in handlebars "each" helper (using in mandrill template) 【发布时间】:2016-06-09 03:12:33 【问题描述】:

我有用于 mandrill 的基于车把的电子邮件模板,并且正在尝试从列表列表中呈现 JSON 数据,其中每个列表最多可以包含 3 个项目。对于每个迭代的内部列表把手,它应该检查索引 0,1,2 是否有任何东西,如果有,对它们做一些事情,如下所示:

#each thing
    #if this.thing.[0]
        Do something here
    /if
    #if this.thing.[1]
        Do something here
    /if
    #if this.thing.[2]
        Do something here
    /if
/each

我注意到,当被迭代的列表只有 2 个项目时,把手会从最后一个有 3 个项目的列表中获取第 3 个项目,所以我猜这个。[2]不是块作用域吗?

例如,如果我使用:

thing = [
    ["a","b","c"],
    ["d","e"]
]

我明白了:

Something with "a"
Something with "b"
Something with "c"
Something with "d"
Something with "e"
Something with "c"

我不确定这是否是 mandrills 实现车把本身的问题,因为我对这两者都是新手。

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

目前,Mandrill 似乎改变了#each 块中的上下文有点有趣。这不是来自 Handlebars,而是来自 Mandril 的实现(我希望他们修复它)。如果有 2 个对象被迭代,并且第一个具有属性,但没有第二个(在您的情况下 -> this.thing.[2]) - 当第二个对象进入范围时,该属性不会获得 '清除'。你可以做的是明确地将它分配给'false' -

thing = [
    ["a","b","c"],
    ["d","e", false]
];

如果你使用对象而不是数组可能会更容易,this.[2]看起来比 this.c 可读性差(我假设您的意思是 this.[2] 而不是 this.thing[2] )。例如。使用

 thing = [
     a : true, b : true, c : true ,
     d : true, e : true, c : false
]

使用相同的模板应该可以正常工作。 @key 让您可以访问密钥。

【讨论】:

谢谢你。这个确切的问题一直把我自己和我的产品负责人逼上绝路。我现在将值明确设置为null,它按预期工作。【参考方案2】:

在我看来,您应该使用 #each 迭代 2 次,而不是使用 #if

这是一个例子

<script id="entry-template" type="text/x-handlebars-template">
#each thing    
    #each item
        value
    /each
/each
</script>

https://jsfiddle.net/ChristopheThiry/y1nmx738/

【讨论】:

我希望我能做到这一点,但我没有在每个索引处做同样的事情

以上是关于“this”似乎在车把“每个”助手中的旧迭代中具有价值(在 mandrill 模板中使用)的主要内容,如果未能解决你的问题,请参考以下文章

each 中的 link-to 未删除 ember 中的旧模板

将模板中写入的数组传递给流星/车把助手

全局助手正在覆盖流星车把模板中的本地上下文

有没有办法获取选项标签值并将其传递给车把中的助手?

无法注册车把助手

迭代快速车把中的对象