143

私は現在、express.jsアプリケーションでhandlebars.jsを扱っています。モジュール化を維持するために、すべてのテンプレートを部分的に分割しました。

私の問題:部分的な呼び出しを介して変数を渡す方法が見つかりませんでした。次のようなパーシャルがあるとしましょう。

<div id=myPartial>
    <h1>Headline<h1>
    <p>Lorem ipsum</p>
</div>

このパーシャルを「myPartial」という名前で登録したとしましょう。別のテンプレートでは、次のように言うことができます。

<section>
    {{> myPartial}}
</section>

これは正常に機能し、パーシャルは期待どおりにレンダリングされ、私は幸せな開発者です。しかし、私が今必要としているのは、この呼び出しを通じてさまざまな変数を渡す方法です。たとえば、見出しが指定されているかどうかなど、パーシャル内をチェックします。何かのようなもの:

<div id=myPartial>
    {{#if headline}}
    <h1>{{headline}}</h1>
    {{/if}}
    <p>Lorem Ipsum</p>
</div>

そして、呼び出しは次のようになります。

<section>
    {{> myPartial|'headline':'Headline'}}
</section>

とか、ぐらい。

テンプレートをレンダリングする前に、必要なすべてのデータを定義できることを知っています。しかし、私は今説明したようにそれを行う方法が必要です。可能な方法はありますか?

4

8 に答える 8

226

ハンドルバーのパーシャルは、パーシャルのコンテキストになる 2 番目のパラメーターを取ります。

{{> person this}}

バージョン v2.0.0 alpha 以降では、名前付きパラメーターのハッシュを渡すこともできます。

{{> person headline='Headline'}}

これらのシナリオのテストを確認できます 。ブロブ/e290ec24f131f89ddf2c6aeb707a4884d41c3c6d/spec/partials.js#L26-L32

于 2012-07-23T15:13:40.207 に答える
19

念のため、部分的な引数を取得するために行ったことを次に示します。パーシャル名とパーシャルに渡されるパラメーターのハッシュを取る小さなヘルパーを作成しました。

Handlebars.registerHelper('render', function(partialId, options) {
  var selector = 'script[type="text/x-handlebars-template"]#' + partialId,
      source = $(selector).html(),
      html = Handlebars.compile(source)(options.hash);

  return new Handlebars.SafeString(html);
});

ここで重要なのは、Handlebars ヘルパーが Ruby のような引数のハッシュを受け入れることです。ヘルパー コードでは、メンバー内の関数の最後の引数 (<code>options) の一部として指定されますhash。このようにして、最初の引数 (名前の一部) を受け取り、その後のデータを取得できます。

次に、ヘルパーから a を返すHandlebars.SafeStringか、"triple‑stash"—<code>{{{— を使用して二重エスケープを防止します。

多かれ少なかれ完全な使用シナリオを次に示します。

<script id="text-field" type="text/x-handlebars-template">
  <label for="{{id}}">{{label}}</label>
  <input type="text" id="{{id}}"/>
</script>

<script id="checkbox-field" type="text/x-handlebars-template">
  <label for="{{id}}">{{label}}</label>
  <input type="checkbox" id="{{id}}"/>
</script>

<script id="form-template" type="text/x-handlebars-template">
  <form>
    <h1>{{title}}</h1>
    {{ render 'text-field' label="First name" id="author-first-name" }}
    {{ render 'text-field' label="Last name" id="author-last-name" }}
    {{ render 'text-field' label="Email" id="author-email" }}
    {{ render 'checkbox-field' label="Private?" id="private-question" }}
  </form>
</script>

これが役に立てば幸いです…誰か。:)

于 2013-09-21T16:23:51.590 に答える
15

独自のヘルパーを作成する場合、これは非常に可能です。このタイプの対話 (およびその他) を実現するために、カスタム$ヘルパーを使用しています。

/*///////////////////////

Adds support for passing arguments to partials. Arguments are merged with 
the context for rendering only (non destructive). Use `:token` syntax to 
replace parts of the template path. Tokens are replace in order.

USAGE: {{$ 'path.to.partial' context=newContext foo='bar' }}
USAGE: {{$ 'path.:1.:2' replaceOne replaceTwo foo='bar' }}

///////////////////////////////*/

Handlebars.registerHelper('$', function(partial) {
    var values, opts, done, value, context;
    if (!partial) {
        console.error('No partial name given.');
    }
    values = Array.prototype.slice.call(arguments, 1);
    opts = values.pop();
    while (!done) {
        value = values.pop();
        if (value) {
            partial = partial.replace(/:[^\.]+/, value);
        }
        else {
            done = true;
        }
    }
    partial = Handlebars.partials[partial];
    if (!partial) {
        return '';
    }
    context = _.extend({}, opts.context||this, _.omit(opts, 'context', 'fn', 'inverse'));
    return new Handlebars.SafeString( partial(context) );
});
于 2013-01-31T03:38:38.113 に答える
15

key=valueこれは、次の表記法を使用して、以降のバージョンのハンドルバーでも実行できます。

 {{> mypartial foo='bar' }}

特定の値を部分コンテキストに渡すことができます。

参照:部分的なコンテキストの違い #182

于 2014-10-08T15:28:44.447 に答える
3

はい、遅くなりましたが、Assembleユーザー向けに追加できます。組み込みの"parseJSON"ヘルパーhttp://assembly.io/helpers/helpers-data.htmlを使用できます。( https://github.com/assemble/assemble/issues/416で発見)。

于 2014-10-23T21:11:25.747 に答える