Handlebars.jsの各ループのスコープ外の変数にアクセスする


188

次のように、handlebars.jsテンプレートがあります。

{{externalValue}}

<select name="test">
    {{#each myCollection}}
       <option value="{{id}}">{{title}} {{externalValue}}</option>
    {{/each}}
</select>

そして、これは生成された出力です:

myExternalValue

<select name="test">
       <option value="1">First element </option>
       <option value="2">Second element </option>
       <option value="3">Third element </option>
</select>

予想通り、のすべての要素のidおよびtitleフィールドにアクセスしてmyCollection、selectを生成できます。そして、selectの外では、externalValue変数が正しく出力されます( "myExternalValue")。

残念ながら、オプションのテキストでexternalValueは、値は出力されません。

私の質問は、ループ内からそれぞれhandlebars.jsのスコープ外の変数にアクセスするにはどうすればよいですか?

回答:


454

試す

<option value="{{id}}">{{title}} {{../externalValue}}</option>

../パスセグメントは、あなたが望むものである必要があり、親テンプレートのスコープを参照します。


10
将来の読者が私のようにまだ問題を抱えている場合は、この回答のコメントをここで見てください。この答えを見た後、それを見るのにしばらく時間がかかりました。../現在の値から離れたスコープの数によっては、繰り返し使用する必要がある場合があります。
bcmcfc 2013

10
私は狂っていますか、またはこのタイプの貴重な情報はハンドルバーのドキュメントにありませんか???
Jesse

1
@spliterは、残りのハンドルバーでこれを機能します。機能していないようです
kweku360

1
@ kweku360はわかりません。これは通常のハドルバーで機能します。Emberは、この機能が別の手段で実装されているハンドルバーのカスタマイズされたバージョンを使用している可能性があります
スプリッター

1
ありがとう、これはFoundation 6 Paniniでも完全に動作します。
Marco

13

または、次のような絶対パスを使用できます。

<option value="{{id}}">{{title}} {{@root.user.path.to.externalValue}}</option>

1

このトピックに関するドキュメントについては、404へのリンクがたくさんありました。

私はこれでそれを更新します、それは2020年4月1日に働いています:

https://handlebarsjs.com/guide/expressions.html#path-expressions

#withや#eachなどの一部のヘルパーを使用すると、ネストされたオブジェクトに飛び込むことができます。パスに../セグメントを含めると、ハンドルバーは親コンテキストに戻ります。

    {{#each people}}
    {{../prefix}} {{firstname}} 
    {{/each}}

コメントのコンテキスト内で名前が出力されても、メインコンテキスト(ルートオブジェクト)に戻ってプレフィックスを取得できます。

警告

../が解決する正確な値は、ブロックを呼び出しているヘルパーによって異なります。../の使用は、コンテキストが変更された場合にのみ必要です。{{#each}}などのヘルパーの子では../を使用する必要がありますが、{{#if}}などのヘルパーの子では必要ありません。

{{permalink}}
{{#each comments}}
  {{../permalink}}

  {{#if title}}
    {{../permalink}}
  {{/if}}
{{/each}}

この例では、異なるブロック内にある場合でも、上記のすべてが同じプレフィックス値を参照しています。この動作はHandlebars 4で新しく追加されました。リリースノートでは、以前の動作と移行計画について説明しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.