# フック

Handlebarsの関数呼び出しにフックできる場所がいくつかあります。

# helperMissing

このフックは、マスタッシュまたはブロックステートメントが

  • 登録済みヘルパーではなく、かつ
  • 現在の評価コンテキストのプロパティでもない場合に呼び出されます。

ヘルパー `helperMissing` を登録することで、これらの状況にカスタム処理を追加できます。

テンプレート ...省略...
{{foo}}
{{foo true}}
{{foo 2 true}}
{{#foo true}}{{/foo}}
{{#foo}}{{/foo}}
準備スクリプト ...省略...
Handlebars.registerHelper('helperMissing', function( /* dynamic arguments */) {
  var options = arguments[arguments.length-1];
  var args = Array.prototype.slice.call(arguments, 0,arguments.length-1)
  return new Handlebars.SafeString("Missing: "+options.name+"("+args+")")
})
出力 ...省略...
Missing: foo()
Missing: foo(true)
Missing: foo(2,true)
Missing: foo(true)

ヘルパーは、カスタムヘルパーまたはブロックヘルパーと同じ引数とオプション(`hash`、`name` など)を受け取ります。 `options.name` は、呼び出されているヘルパーの名前です。

# デフォルトの動作

マスタッシュにパラメータが渡されない場合、デフォルトの動作では何もせず、マスタッシュ式全体またはブロック全体を無視します。

テンプレート ...省略...
some_{{foo}}mustache
some_{{#foo}}abc{{/foo}}block
出力 ...省略...
some_mustache
some_block

マスタッシュにパラメータが渡された場合、Handlebarsは例外をスローします。

テンプレート ...省略...
{{foo bar}}
{{#foo bar}}abc{{/foo}}
エラー ...省略...
Missing helper: "foo"

# blockHelperMissing

このフックは、

  • ブロック式が登録されていないヘルパーを呼び出し、
  • しかし、名前が現在の評価コンテキストのプロパティと一致する場合に呼び出されます。

`blockHelperMissing` という名前のヘルパーを登録することで、この状況を処理できます。

テンプレート (プレイグラウンドで表示)
{{#person}}
  {{firstname}} {{lastname}}
{{/person}}
準備スクリプト ... (SVG アイコンと同じ) ... (プレイグラウンドで表示)
Handlebars.registerHelper('blockHelperMissing', function(context, options) {
    return "Helper '"+options.name+"' not found. " 
      + "Printing block: " + options.fn(context); 
});
出力 ... (SVG アイコンと同じ) ... (プレイグラウンドで表示)
Helper 'person' not found. Printing block:   Yehuda Katz

# デフォルトの動作

フックは、現在のコンテキストで解決されたプロパティ値と、プロパティの名前に設定された `options.name` フィールドを使用して呼び出されます。

フックがオーバーライドされていない場合、デフォルトの実装は Mustache の動作を模倣し、単にブロックを呼び出します。

テンプレート ... (SVG アイコンと同じ) ... (プレイグラウンドで表示)
{{#person}}
  {{firstname}} {{lastname}}
{{/person}}
出力 ... (SVG アイコンと同じ) ... (プレイグラウンドで表示)
  Yehuda Katz
最終更新日: 2021年3月17日 午後9時38分49秒