使用句柄栏“每个”循环访问父级的属性

2022-08-30 00:53:51

请考虑以下简化数据:

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

和车把模板:

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

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


答案 1

有两种有效的方法可以实现此目的。

取消引用父作用域../

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

{{#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

有关详细信息,请参阅有关路径的车把文档

取消引用根作用域@root

通过附加到属性路径,可以从最上面的范围向下导航(如 caballerog 的答案所示)。@root

有关详细信息,请参阅有关@data变量的车把文档


答案 2

新方法使用点表示法,斜杠表示法已弃用(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 array as |value key|}}  
 {{#each child as |childValue childKey|}}
     {{key}} - {{childKey}}. {{childValue}}   
 {{/each}} 
{{/each}} 

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