37

是否有任何内置方法可以访问 Handlebars.js 模板中的根上下文?大多数助手都在添加嵌套上下文,您必须在该上下文中的变量之前编写 ../ 才能访问它,但如果您有很多 eachs、ifs 等,这不是很实用。

4

4 回答 4

74

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

{{@root.somthing.nested_somthing}}
于 2014-09-05T15:11:55.017 回答
8

一旦您通过循环(例如每个)更改上下文,就不可能访问模板的根上下文更多信息

但是有可能访问以前的上下文'../'

# 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 了解更多信息

于 2013-11-15T11:37:34.190 回答
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 + "']";
    }
};
于 2013-09-21T01:46:56.377 回答
0

还没有!

已经建议了几次,并且有一个开放的票:https ://github.com/wycats/handlebars.js/issues/392

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

于 2013-07-30T11:15:18.103 回答