Handlebars.js: カスタムヘルパーの内部からパーシャルをレンダリングすることは可能ですか?

作成日 2015年07月10日  ·  4コメント  ·  ソース: handlebars-lang/handlebars.js

次のようなことをしたいのですが-

Handlebars.registerHelper('include', function(path, options) {
  return Handlebars.renderPartial(path, context, hash); //this is a js interface which matches the hbs partial interface
});

これが必要な主な理由は、ヘルパー構文で使用したいパーシャルがいくつかあることです。 私のヘルパーは部分的な機能を拡張することもできます。 たとえば、ブロックコンテンツを取得し、それをvarとして部分テンプレートにコンテキストvarとして渡すことができます。

最も参考になるコメント

ヘルパー内の任意の文字列をコンパイルおよびレンダリングできます。 したがって、すでにHandlebars.registerPartial('my-partial', 'my partial content')を使用してパーシャルを追加している場合は、これを行うことができます...

Handlebars.registerHelper('include', function (path, options) {
  var partial = Handlebars.partials[path];
  if (typeof partial !== 'function') {
    partial = Handlebars.compile(partial);
  }
  return partial(context); // build up the context some how
});

次に、 {{include 'my-partial'}}のようなハンドルバーで使用します。

全てのコメント4件

ヘルパー内の任意の文字列をコンパイルおよびレンダリングできます。 したがって、すでにHandlebars.registerPartial('my-partial', 'my partial content')を使用してパーシャルを追加している場合は、これを行うことができます...

Handlebars.registerHelper('include', function (path, options) {
  var partial = Handlebars.partials[path];
  if (typeof partial !== 'function') {
    partial = Handlebars.compile(partial);
  }
  return partial(context); // build up the context some how
});

次に、 {{include 'my-partial'}}のようなハンドルバーで使用します。

ありがとう@doowb

Handlebars.compileはhandlebars-runtime内で機能しますか?

ハッシュパラメータを渡す方法がまだ必要です

ハンドルバーランタイムは、 compileメソッドを明示的に省略します。 パーシャルへの呼び出しでそれらを渡すことにより、独自のハッシュパラメータを渡すことができます。

これは機能のリクエストではなく、数日間アクティビティがなかったため、これを閉じます。

閉鎖的で古いことは知っていますが、答えや例はありません。 私はこれを行っていますが、私が試した単純なケースではうまくいくようです。複雑なケースは試していません。

<!-- compiled as Handlebars.template.displayName -->
{#each this}}
Hello {{#if isMale}}Mr.{{else}}Mrs.{{/if}} {{renderPartial nameRenderer this}}
{{/each}}
Handlebars.registerPartial("capital", "{{captialize firstname}} {{captialize middleName}} {{captialize lastname}}");
Handlebars.registerPartial("midinit", "{{upper firstname}} {{upper middleName}} {{upper lastname}}");
Handlebars.registerPartial("midinit", "{{firstname}} {{firstChar middleName}} {{lastname}}");
Handlebars.registerHelper('renderPartial', function(partial, context) {
    return Handlebars.compile(Handlebars.partials[partial])(context);
});
Handlebars.registerHelper('firstChar', function(name) {
    return name.substring(0,1);
});
Handlebars.registerHelper('upper', function(name) {
    return name.toUpperCase();
});
Handlebars.registerHelper('captialize', function(name) {
    return name.substring(0,1).toUpperCase() + name.substring(1);
});
var data = [{
  isMale: true,
  firstname: "david",
  middleName: "tom",
  lastname: "henry",  
  nameRenderer: "capital"
}, {
  isMale: true,
  firstname: "david",
  middleName: "tom",
  lastname: "henry",  
  nameRenderer: "midinit"
}, {
  isMale: false,
  firstname: "nancy",
  middleName: "tracey",
  lastname: "henry",  
  nameRenderer: "uppercased"
}];

Handlebars.template.displayName(data);
/* returns
Hello Mr. David Tom Henry
Hello Mr. david t henry
Hello Mrs. NANCY TRACEY HENRY
*/
このページは役に立ちましたか?
0 / 5 - 0 評価