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

有一个明显的解决方案看起来很干净,有时可能更受欢迎:在模板周围定义一个范围,在其中定义你的变量,然后让范围产生你需要的 html 代码,如下所示:

@{
  val title = "Home"

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

这有一些缺点:

  • 您正在以NodeSeq这种方式将 html 生成为 Scala,这有时可能会受到限制
  • 此解决方案存在性能问题:其中的代码@{似乎是在运行时编译的,因为为页面生成的 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 回答