ちょっとCommon Caseとは分けて記事にしました。
独自ファンクションの実装方法。
とても便利だ、、、。
ほとんど公式サイトのままですけど、ちょこっとだけ変えてます。
独自ファンクションの実装方法
[java toolbar=”false”]
//views/tags/notice.scala.html
@(level: String = “error”)(body: (String) => Html)
//views/tags/notice.scala.html
@(level: String = “error”)(body: (String) => Html)
@level match {
case “success” => {
@body(“green”)
}
case “warning” => {
@body(“orange”)
}
case “error” => {
@body(“red”)
}
}[/java]
これはとても分かり易いですね。
単なるswitch文みたいなファンクションを定義してます。
テンプレート引数が2つあるので、あえてこのファンクションテンプレート(と仮に呼びます)
をJavaっぽく書くと、
[java toolbar=”false”]public void notice(String level, Html body)[/java]
こんな感じでしょうか。
内容は、「テンプレート引数のlevelが次のcaseにmatchした場合はこうして」ということ。
これを呼び出すテンプレートも見てみましょう。
[java toolbar=”false”]
@import tags._
@import tags._
@notice(“error”) { arg =>
お, 色変わるぞ。
}
[/java]
※bodyはplay.api.templates.Html型です。「テンプレート引数に、更に引数を渡せるの?」という複雑な現象ではなくて、単にHtmlクラスが引数を1つ取れるように実装されているだけなのです。なので、@body(“green”,”13px”)みたいにするとコンパイルエラーになります。
caseの中で呼ばれている@body※の引数(greenとかred)が上のコードの「arg」にあたります。
ここでは第一引数がerrorになっているので、notice側の
[java toolbar=”false”] case “error” => {
@body(“red”)
}[/java]
が呼び出されます。
よって、表示されるのは、
[java toolbar=”false”]
お,色変わるぞ。
[/java]
こんな感じのHtmlです。
アセスメント
- 独自ファンクションを定義する方法が分かる
- 独自ファンクションを使用する方法が分かる
公式ドキュメントは前回と同じく、Common template use casesでした。