Handlebars.js: テンプレートに変数を割り当てる

作成日 2013年03月29日  ·  11コメント  ·  ソース: handlebars-lang/handlebars.js

テンプレート内で変数を割り当てて、外部からの変数のように使用することは可能ですか?

例:
テーブルを出力したいのですが、データ(fields []。field2)が存在するかどうかに応じて、1列はオプションです。

各行でチェックするのは問題ありませんが、ヘッダーをチェックする方法は?

<table>
  <thead>
    <tr>
      <th>Head 1</th>
      <th>Head 2 (optional)</th>
      <th>Head 3</th>
    </tr>
  </thead>
{{#each fields}}
  <tr>
    <td>{{{field1}}}</td>
    {{#if field2}}<td>{{{filed2}}}</td>{{/if}}
    <td>{{{field3}}}</td>
  </tr>
{{/each}}
</table>

現時点では、ヘルパーを作成する非定常ヘルパー関数「assign」を使用しています。

{{#each fields}}
  {{#if field2}}
    {{assign "helperVar" "<th>Head 2 (optional)</th>"}}
  {{/if}}
{{/each}}

Output with: {{{helperVar}}}

しかし、それは良い解決策ではなく、#ifでは使用できません。

最も参考になるコメント

:+1:

@kpdeckerテンプレートには、ループ、ifステートメント、およびその他の多くのロジック構造を含めることができます。 しかし、どうやら変数を割り当てることは、テンプレートのロジックが多すぎるのでしょうか? 他のデフォルトのヘルパーに、単に変数を割り当てる機能よりもはるかに多くのロジックが含まれている場合、その決定の背後にある理由は実際にはわかりません。

全てのコメント11件

これは論理のないテンプレートの前提に反しており、これは言語レベルの構成であるべきではないと思います。

ここで推奨されるアプローチは、コンテキスト作成ロジックでこのデータを計算し、それをテンプレートに渡すことだと思います。 これにより、テンプレート言語で実装されているサブセットではなく、完全なjavascript言語を自由に使用できるため、より詳細な制御が可能になります。

template({
  fields: fields,
  hasField2: _.any(fields, function(item) { return item.field2; })
});

これは、テンプレートにロジックを追加するのではなく、そのテンプレートに固有の変数を渡すための優れた機能だと思います。

たとえば、2つのテンプレートが同じパーシャルを使用しています。 テンプレートレベルからそのパーシャルにいくつかの変数を渡して、パーシャルのスコープ内の異なるテンプレートに対して異なるものが出力されるようにしたいと思います。

+1

+1

:+1:

:+1:

@kpdeckerテンプレートには、ループ、ifステートメント、およびその他の多くのロジック構造を含めることができます。 しかし、どうやら変数を割り当てることは、テンプレートのロジックが多すぎるのでしょうか? 他のデフォルトのヘルパーに、単に変数を割り当てる機能よりもはるかに多くのロジックが含まれている場合、その決定の背後にある理由は実際にはわかりません。

+1

+1

+1

+1

これらの線に沿った何かは、ブロックパラメータを使用して実装でき、ここに文書化されています。
http://handlebarsjs.com/block_helpers.html#block -params

これは現在のコンテキスト外の別の名前空間で行われるため、コンテキストの割り当てに対してより一貫した動作を提供します。

このページは役に立ちましたか?
0 / 5 - 0 評価