2

テンプレート内の Play Framework では、次のような関数を定義できます。

@title(text: String) = @{
  text.split(' ').map(_.capitalize).mkString(" ")
}

<h1>@title("hello world")</h1>

そのような関数を別のファイルで定義して、複数のテンプレート間で再利用できるようにすることはできますか?

4

2 に答える 2

3

少なくともいくつかの解決策があります。

まずMakisが示したようにタグを使用します。ほとんどの場合、空の行を追加しても問題ありません (少なくとも、HTML スニペットの生成について話している場合、つまり、リストで繰り返しニュース項目を表す場合) - できます。転送速度が気になる場合は、後処理で HTML を最適化/圧縮してください。

2 つ目は、静的関数 (Java でも可能) を含み、 を返す Scala オブジェクトを作成することplay.twirl.api.Html("<div>your code</div>")です。このようにして、プログラムでコードを必要に応じて正確に適合させたり、空行を避けたり、スペースを削除または置換したりできます。次のような構文を使用する必要があります:ビュー内で返されたコードをエスケープする必要がない原因を返します@full.qualified.path.to.Object.method("foo", "bar")Html("...")

3 番目のアプローチは、独自のTemplateMagic のようなメソッドを使用して、任意の型のオブジェクトを拡張し、その上でロジックを実行できるようにすることです。良いサンプルは"active".when(someCondition)構文です。 repo で行われていることがわかります。もちろん、このようなカスタム クラスを作成し、ビューの最初にインポートする必要があります。また、引数は 1 つだけである必要はないことに注意してBooleanください。メソッドでは、必要な数のパラメーター (必要な任意の型) を使用できます。パラメータなしにすることもできます。

編集 - サンプル:

アプリ/myapi/MyMagic.scala

package myapi

import play.twirl.api.Html

import scala.language.implicitConversions

object MyMagic {

  class RichString(string: String) {

    def upperWords() = {
      Html(string.split(' ').map(_.capitalize).mkString(" "))
    }

    def bold() = {
      Html("<b>" + string + "</b>")
    }

    def when(predicate: => Boolean) = {
      predicate match {
        case true => string
        case false => ""
      }
    }

  }

  implicit def richString(string: String): RichString = new RichString(string)
}

ビューでの使用

@(title: String)
@import myapi.MyMagic._

@main("Welcome to Play") {

    @title.upperWords() <br>
    @{"foo bar baz".upperWords()} <br>
    @{"I'm bolded LOL".bold()} <br>

    <ul>
        @for(item <- 1 to 10){
            <li >Item no.: @{item} @{"(first item)".when(item==1)}</li>
        }
    </ul>    
}
于 2016-01-06T15:36:01.720 に答える
1

title.scala.html次の内容で名前が付けられた新しいファイルを作成できます。

@(text: String)

@title(text: String) = @{
    text.split(' ').map(_.capitalize).mkString(" ")
}

@title(text)

その後、必要に応じてテンプレートで使用できます。

于 2016-01-06T11:30:17.560 に答える