web-dev-qa-db-ja.com

Play2 scalaテンプレートで変数を宣言する

Play2 Scalaテンプレートでローカルに使用される変数をどのように宣言し、初期化しますか?

私はこれを持っています:

@var title : String = "Home"

テンプレートの先頭で宣言されていますが、このエラーが発生します:

illegal start of simple expression """),_display_(Seq[Any](/*3.2*/var)),format.raw/*3.5*/(""" title : String = "Home"
56
travega
@defining("foo") { title=>
  <div>@title</div>
  ...
}

基本的には、使用するブロックをラップする必要があります

53
virtualeyes

実際、@ c4kのソリューションは、後で変数の値を変更しようとしない限り機能しています(非常に便利です)。

これをテンプレートの一番上に配置するだけです:

@yourVariable = {yourValue}

または、より複雑な式の場合は、次のようにします。

@yourVariable = @{yourExpression}

そのようなリストのようなものを扱うことさえできます:

@(listFromController: List[MyObject])
@filteredList = @{listFromController.filter(_.color == "red")}

@for(myObject <- filteredList){ ... }

与えられた例では、これは

@title = {Home}  //this should be at beginning of the template, right after passing in parameters

<h1> Using title @title </h1>

あなたが言ったコメントでは、それはHTMLタイプにタイプされます。ただし、これは、@title再び、そうではありませんか?

39
ollie

scalaテンプレートはこれをサポートしています。テンプレートで変数を定義できます

@import Java.math.BigInteger; var i=1; var k=1

テンプレートの値を変更する場合

@{k=2}

@(title:String)(implicit session:play.api.mvc.Session)
@import Java.math.BigInteger; var i=1; var k=1
^
<div id='LContent_div@i'>
                     ^
  <div id='inner_div_@k'></div>
                     ^
</div>
15
Govind Singh

virtualeyesのソリューションは適切なものですが、他の可能性もあります。通常はデフォルト値を使用してビューのparamを宣言することができます。その場合、テンプレート全体で利用可能になり、 controller

@(title: String = "Home page")

<h1>Welcome on @title</h1>

コントローラ:

def index = Action{
    Ok(views.html.index("Other title"))
}

Javaコントローラはテンプレートのデフォルト値を認識しないため、毎回追加する必要があります。

public static Result index(){
    return ok(views.html.index.render("Some default value..."));
}
11
biesior

すべてのコンテンツを@definingでラップしたくない場合は、次のようにします。

@yourVariable = { yourValue }

@definingディレクティブはテンプレートでは実際には読み取り不可です...

4
c4k

きれいに見え、時々好まれる明らかな解決策が1つあります。テンプレートの周りにスコープを定義し、その中に変数を定義し、スコープが次のように必要なhtmlコードを生成するようにします。

@{
  val title = "Home"

  <h1>Welcome on {title}</h1>
}

これにはいくつかの欠点があります。

  • この方法でScala NodeSeqとしてHTMLを生成しています。
  • このソリューションにはパフォーマンスの問題があります:@{内のコードはランタイムとしてコンパイルされているようです。なぜなら、ページに対して生成されたScala ):

生成されたコード:

...    

Seq[Any](format.raw/*1.1*/("""<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Basic Twirl</title>
    </head>
    <body>

        """),_display_(/*9.10*/{
            val title = "Home"

                <h1>Welcome on {title}</h1>
        }),format.raw/*15.10*/("""

    """),format.raw/*17.5*/("""</body>
</html>"""))
      }
    }
  }

...
3
Suma

回転テンプレートでは、定義ブロックを使用することをお勧めします。

@random = @{
     new Random().nextInt
}

<div id="@random"></div>
<div id="@random"></div>

複数回使用すると異なる値になります!

@defining(new Random().nextInt){ random =>
    <div id="@random"></div>
    <div id="@random"></div>
}
1
Spektakulatius
@isExcel= {@Boolean.valueOf(Java.lang.System.getProperty(SettingsProperties.isExcel))}
0
Eassa Nassar