Handlebars 'each'루프를 사용하여 부모의 속성에 액세스


204

다음과 같은 단순화 된 데이터를 고려하십시오.

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

그리고 핸들 바 템플릿 :

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

each루프 내에서 부모 범위에 액세스 할 수 없기 때문에 작동 하지 않습니다. 적어도 내가 시도한 방식은 아닙니다. 나는 이것을하는 방법이 있기를 바라고 있습니다!

답변:


423

이를 달성하기위한 두 가지 유효한 방법이 있습니다.

부모 범위를 역 참조 ../

../속성 이름 앞에 추가 하면 부모 범위를 참조 할 수 있습니다.

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

@root속성 경로 앞에 추가 하면 caballerog의 답변에 표시된 것처럼 최상위 범위에서 아래쪽으로 탐색 할 수 있습니다 .

자세한 내용 은 @data 변수에 대한 Handlebars 설명서를 참조하십시오 .


101
../를 사용하여 부모 속성을 얻는 것에 대한 참고 사항. 중첩 된 #if가있는 각 명령문이있는 경우 ../ 만 수행하면 #each 레벨로 이동합니다. 따라서 #each 외부의 부모에게 돌아가려면 ../../itemSize를 수행해야합니다.
TheStoneFox

1
mustache.js 템플릿 엔진에서이 기능을 어떻게 얻을 수 있습니까?
blushrt

2
@blushrt 당신은하지 않습니다. 핸들 바에 따라 다릅니다.
19 시간

3
@ TheTaxPayer 당신은 방금 엄청난 양의 두통을 구했습니다! 양말을 신은 채 :)
Peter P.

4
도우미로 상위 레벨 #each 값을 전달하는 방법에 대한 어떤
올렉 Belousov

60

새로운 방법은 도트 표기법을 사용하고 슬래시 표기법은 더 이상 사용되지 않습니다 ( 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}}와 동일하지만 대부분의 경우 더 읽기 쉽습니다.


1
한 단계 올라가면 "@ root.itemSize"를 사용했습니다.
Sam Tyson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.