使用 Handlebars 'each' 循环访问父级的属性

IT技术 javascript handlebars.js
2021-01-24 23:46:08

考虑以下简化数据:

var viewData = {
    itemSize: 20,
    items: [
        'Zimbabwe', 'dog', 'falafel'
    ]
};

还有一个 Handlebars 模板:

{{#each items}}
    <div style="font-size:{{itemSize}}px">{{this}}</div>
{{/each}}

这将不起作用,因为在each循环内,父作用域不可访问——至少我尝试过的任何方式都无法访问。我希望有一种方法可以做到这一点!

4个回答

有两种有效的方法可以实现这一点。

取消引用父作用域 ../

通过../在属性名称之前添加,您可以引用父作用域。

{{#each items}}
    <div style="font-size:{{../itemSize}}px">{{this}}</div>
    {{#if this.items.someKey}}
       <div style="font-size:{{../../itemSize}}px">{{this}}</div>  
    {{/if}}
{{/each}}

您可以通过重复../. 例如,要上升两个级别,请使用../../key.

有关更多信息,请参阅有关路径Handlebars 文档

取消引用根范围 @root

通过添加@root到属性路径,您可以从最顶部的范围向下导航(如caballerog 的回答所示)。

有关更多信息,请参阅有关 @data 变量Handlebars 文档

将上层 #each 值传递给助手怎么样
2021-03-14 23:46:08
@TheTaxPayer 你刚刚帮我省了很多麻烦!穿上你的袜子继续摇滚:)
2021-03-19 23:46:08
关于使用 ../ 获取父属性的注意事项。如果您有一个带有嵌套 #if 的 each 语句,那么只执行 ../ 只会让您达到 #each 的级别。所以你必须做 ../../itemSize 才能回到 #each 之外的父级
2021-03-30 23:46:08
如何在 mustache.js 模板引擎中获得此功能?
2021-04-05 23:46:08
@blushrt 你没有。那是车把特定的
2021-04-05 23:46:08

新方法使用点表示法,不推荐使用斜线表示法(http://handlebarsjs.com/expressions.html)。

因此,访问父元素的实际方法如下:

@root.grandfather.father.element
@root.father.element

在您的具体示例中,您将使用:

{{#each items}}
 <div style="font-size:{{@root.viewData.itemSize}}px">{{this}}</div>
{{/each}}

官方文档(http://handlebarsjs.com/builtin_helpers.html)中的另一种方法是使用别名

each 助手还支持块参数,允许在块中的任何位置命名引用。

{{#each array as |value key|}}  
 {{#each child as |childValue childKey|}}
     {{key}} - {{childKey}}. {{childValue}}   
 {{/each}} 
{{/each}} 

将创建一个键和值变量,孩子们可以访问而无需深入的变量引用。在上面的示例中,{{key}} > 与 {{@../key}} 相同,但在许多情况下更具可读性。

从技术上讲,这不会上升一级 - 它会从根目录下降一级,并且仅当您下降一级时才有效。如果您不知道当前的嵌套级别,则此方法不起作用。
2021-03-17 23:46:08
使用“@root.itemSize”为我提升一级。
2021-03-30 23:46:08

不幸的是 ../ 取消引用似乎不能通过部分工作。但是我们可以向传递给局部的上下文添加属性:

Name: {{parent.name}}

{{#each children}}
    {{> childpartial this parent=../parent}}
{{/each}}

儿童部分:

{{name}} is child of {{parent.name}}

更多: 把手 - 是否可以部分访问父上下文?

我们可以使用 {{../parent.propertyname}} 访问 parent