HandleBarsテンプレートのBlock If If内でヘルパーを呼び出します
-
27-10-2019 - |
質問
私はhandlebars.jsテンプレートエンジンと協力しており、このようなことをする方法を見つけようとしています(考慮された例):
{{#if itemSelected "SomeItem"}}
<div>This was selected</div>
{{/if}
どこ itemSelected
このような登録ヘルパーです。
Handlebars.registerHelper("itemSelected", function(item) {
var selected = false;
// Lots of logic that determines if item is selected
return selected;
});
この構文をテンプレートに使用しようとするとエラーが発生し、この種のことを示す例が見つかりません。このような単純な#ifブロックが見えます...
{{#if myValueInContext}}
<div>This will show if myValueInContext results in a truthy value.</div>
{{/if}}
しかし、最初の例に取り組む方法を理解することはできません。多分私はこれを間違っています。
ちなみに、質問にハンドルバーのタグを追加できなかったため、この口ひげにタグを付けました。
解決
これがうまくいくとは思わない。ハンドルバーのドキュメントが正しいことを理解している場合、#IFは登録されたブロックヘルパー自体であり、別の登録ヘルパーを引数として受け取らない。
ドキュメントによると、あなたはそれをそのように実装するかもしれません
Handlebars.registerHelper('ifItemSelected', function(item, block) {
var selected = false;
// lots of logic that determines if item is selected
if(selected) {
return block(this);
}
});
その後、あなたはそれをで呼ぶことができるはずです
{{#ifItemSelected SomeItem}}
This was selected
{{/ifItemSelected}
しかし、あなたは確かにしなければなりません someitem 適切な形式があります。登録済みハンドラーをIFステートメントの条件として使用する方法はありません。
他のヒント
埋め込みヘルパーの呼び出しの周りに括弧を追加する必要があります。
{{#if (itemSelected "SomeItem")}}
<div>This was selected</div>
{{/if}
私は実験を行い、それが機能することを確認しました。
ハンドルバーのドキュメントで言及されているかどうかはわかりません。の例からトリックを学びました ハンドルバーレイアウト.
ハンドルバーの最後のバージョン(1.0.RC.1)を使用すると、次のようなSTHを書く必要があります。
Handlebars.registerHelper('ifItemSelected', function(item, options) {
var selected = false;
// lots of logic that determines if item is selected
if (selected) {
return options.fn(this);
}
});
すなわち。 ブロック(これ) に置き換えられます options.fn(this)
他のオプションも必要な場合は、このコードが必要になります。
Handlebars.registerHelper('ifItemSelected', function(item, options) {
var selected = false;
// lots of logic that determines if item is selected
if (selected) {
return options.fn(this);
}
else {
return options.inverse(this);
}
});
使用:
{{#ifItemSelected SomeItem}}
This was selected
{{else}}
This was not selected
{{/ifItemSelected}