Свойства доступа родителя с петлей Handlebars 'each'

Рассмотрим следующие упрощенные данные:

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

И шаблон Handlebars:

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

Для получения дополнительной информации см. документацию Handlebars на пути.

Ответ 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}}, но во многих случаях более читаем.