web-dev-qa-db-ja.com

Handlebar.jsテンプレートのルートコンテキストへのアクセス

Handlebars.jsテンプレートのルートコンテキストにアクセスするための組み込みメソッドはありますか?ほとんどのヘルパーはネストされたコンテキストを追加しており、それにアクセスするためにそのコンテキストの変数の前に../を書く必要がありますが、それぞれ、ifsなどがたくさんある場合、それはあまり実用的ではありません。

32
isHristov

@rootを使用します。これはhandlebars-v2.0.0.jsにあります

{{@root.somthing.nested_somthing}}
59
jaegow

ループでコンテキストを変更すると(たとえば、それぞれ)、テンプレートのルートコンテキストにアクセスすることはできません 詳細

ただし、'../'を使用して以前のコンテキストにアクセスする可能性があります

# 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 を確認してください

6
equivalent8

はい、作成しました 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 + "']";
    }
};
2
Mike Griffin

まだです!

これは何度か提案されており、オープンチケットがあります: https://github.com/wycats/handlebars.js/issues/392

彼らの主張は、それは必須ではないということですが、それが識別可能なパフォーマンスのオーバーヘッドがない安価な修正である場合、それを含めることができない理由はわかりません。

0
sidonaldson