2013-06-28 39 views
23

是否有任何内置方法来访问Handlebars.js模板中的根上下文? 大部分助手都添加了嵌套上下文,并且必须在该上下文中的变量之前写入../才能访问该变量,但如果每个助手都有很多每个变量,ifs等,那么该变量就不是很实用。访问Handlebar.js模板中的根上下文

回答

42

使用@root。这是在句柄-v2.0.0.js

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

你也可以在'if'和'each'块中使用@root,例如, '{{#each @ root.somthing.nested_somthing}}' – user393274

+0

感谢您指出引入的版本。我们失败了,直到我们意识到我们正在使用handlebars-v.1.3.0.js –

2

是的,我已经创建了一个看http://www.my2ndgeneration.com/TemplateLanguageDoc.aspx#xroot

基本上,添加这个帮手和宾果{{xRoot}}将带你到顶部...

我总是通过我的JSON数据到像车把这样的:

{ 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

一旦您通过循环更改了上下文 (例如,),则无法访问模板的根上下文。每个)more info

但是有访问之前的环境与'../'

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

模板的可能性:

<!-- 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更多信息

相关问题