访问Handlebar.js模板中的根上下文

时间:2013-06-28 12:37:19

标签: javascript handlebars.js

是否有任何内置方法可以访问Handlebars.js模板中的根上下文? 大多数帮助程序都添加了嵌套上下文,你必须在该上下文中的变量之前编写../来访问它,但如果你有很多,ifs等,那就不太实用。

4 个答案:

答案 0 :(得分:56)

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

{{@root.somthing.nested_somthing}}

答案 1 :(得分:5)

更改上下文后,无法访问模板的根上下文 循环(例如每个)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了解更多信息

答案 2 :(得分: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 + "']";
    }
};

答案 3 :(得分:0)

还没有!

有人建议过几次,并且有一张开放票:https://github.com/wycats/handlebars.js/issues/392

他们的论点是它不是必需的,但如果它是一个没有明显性能开销的廉价修复,我不明白为什么它不能被包含。