57

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

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

@var title : String = "Home"

テンプレートの上部で宣言されていますが、次のエラーが発生します。

illegal start of simple expression """),_display_(Seq[Any](/*3.2*/var)),format.raw/*3.5*/(""" title : String = "Home"
4

9 に答える 9

55
@defining("foo") { title=>
  <div>@title</div>
  ...
}

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

于 2012-08-20T01:01:30.883 に答える
42

実際、後で変数の値を変更しようとしない限り、@ 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ありますね?

于 2015-08-04T09:11:09.963 に答える
17

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>
于 2014-01-28T05:37:28.843 に答える
11

virtualeyesのソリューションは適切なものですが、他の可能性もあります。ビューのパラメーターを通常どおりデフォルト値で宣言できます。そのような場合は、テンプレート全体で使用できるようになり、から変更する可能性があります。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..."));
}
于 2012-08-20T06:34:27.170 に答える
5

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

@yourVariable = { yourValue }

@definingディレクティブは、テンプレートでは実際には読み取れません...

于 2014-03-08T19:32:17.513 に答える
3

非常にきれいに見え、場合によっては好まれる可能性のある明らかな解決策が1つあります。テンプレートの周囲にスコープを定義し、その中に変数を定義し、スコープに必要なhtmlコードを次のように生成させます。

@{
  val title = "Home"

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

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

  • この方法でHTMLをScalaとして生成してNodeSeqいるため、制限される場合があります
  • このソリューションにはパフォーマンスの問題があり@{ます。ページ用に生成されたScalaコードは次のように見えるため(通常のTwirlのものは削除されます)、内部のコードはコンパイルされたランタイムのようです。

生成されたコード:

...    

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>"""))
      }
    }
  }

...
于 2016-10-17T09:48:08.050 に答える
2

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

@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>
}
于 2018-12-13T16:40:55.637 に答える
1

Govind Singhの答えを試す人のために:パラメータリストの
に変数を含むインポート行を配置する必要がありました。

@(title:String)(implicit session:play.api.mvc.Session)
@import java.math.BigInteger; var i=1; var k=1

動作します。

ただし、インポートステートメントの上に変数を含むインポートを配置します。

@import java.math.BigInteger; var i=1; var k=1
@(title:String)(implicit session:play.api.mvc.Session)

私のために動作せず、エラーが発生しました:

expected class or object definition
于 2021-07-16T11:41:45.620 に答える
0
@isExcel= {@Boolean.valueOf(java.lang.System.getProperty(SettingsProperties.isExcel))}
于 2016-10-03T11:45:33.870 に答える