2013-06-28 2 views
23

Handlebars.js 템플릿의 루트 컨텍스트에 액세스하기위한 기본 제공 방법이 있습니까? 헬퍼의 대부분은 중첩 된 컨텍스트를 추가하고 있기 때문에 해당 컨텍스트의 변수 앞에 ../를 써야만 액세스 할 수 있지만 각 개체, ifs 등이 많으면 실용적이지 않습니다.Handlebar.js 템플릿의 루트 컨텍스트에 대한 액세스

답변

42

사용 @root에 대한

<!-- app/assets/javascript/templates/my_content.hbs --> 
<table class="table"> 
    <tbody> 

    {{#each view.data.items}} 
    <tr> 
     <td>{{@key}}</td> 
     <td> 
     Hello from {{../view.registryName}} 
     </td> 
    </tr> 
    {{/each}} 
    </tbody> 
</table> 

체크 http://handlebarsjs.com/#paths : 각) more info

그러나 '../'

# app/assets/javascript/contents.coffee 
body = HandlebarsTemplates['my_hbs_template']({ 
    view:{ 
    registryName: 'foo', 
    data: {items: {x: 'x'}} 
    } 
    }) 

템플릿으로 이전 컨텍스트에 액세스 할 수있는 가능성이있다. 이 핸들-v2.0.0.js

{{@root.somthing.nested_somthing}} 
+1

또한'each' 블록을 if''에 @root 사용할 수 있으며, 예를 들어,에 '{{#each @ root.somthing.nested_somthing}}' – user393274

+0

소개 된 버전을 지적 해 주셔서 감사합니다. 핸들 바 (v.1.3.0.js)로 작업 할 때까지는 실패했습니다. –

0

아니요 아직!

그것은 몇 번 제안되었으며 오픈 티켓이 : https://github.com/wycats/handlebars.js/issues/392

그들의 인수가 필요하지 않다는이지만 더 식별 할 수있는 성능 오버 헤드의 저렴한 수정의 경우 내가 왜 표시되지 않습니다는 포함될 수 없습니다.

2

네,

나는 언제나처럼 핸들에 내 JSON 데이터를 전달 ... 하나, 기본적으로

http://www.my2ndgeneration.com/TemplateLanguageDoc.aspx#xroot 볼이 도우미 및 정상에 당신을 데려 갈 것이다 빙고 {{xRoot을}} 추가 만들었습니다 이 :

{ data: self.data } 

따라서 항상 아래 코드는 xRoot 태그가 보는 "데이터"를 반환하고 상단

Handlebars.JavaScriptCompiler.prototype.nameLookup = function (parent, name, type) { 

    if (name.indexOf("xRoot") === 0) { 
     return "data"; 
    } 

    if (/^[0-9]+$/.test(name)) { 
     return parent + "[" + name + "]"; 
    } else if (Handlebars.JavaScriptCompiler.isValidJavaScriptVariableName(name)) { 
     return parent + "." + name; 
    } 
    else { 
     return parent + "['" + name + "']"; 
    } 
}; 
로 나를 소요
6

일단 문맥을 변경하면 템플릿의 루트 컨텍스트에 액세스 할 수 없습니다. (예 : 더 많은 정보

관련 문제