如何声明和初始化要在Play2 Scala模板中本地使用的变量?
我有这个:
@var title : String = "Home"
在模板的顶部声明,但它给了我这个错误:
illegal start of simple expression """),_display_(Seq[Any](/*3.2*/var)),format.raw/*3.5*/(""" title : String = "Home"
答案 0 :(得分:53)
@defining("foo") { title=>
<div>@title</div>
...
}
基本上,你必须包装你将要使用它的块
答案 1 :(得分:38)
实际上,@ 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
时,这才有意义,不是吗?
答案 2 :(得分:15)
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>
答案 3 :(得分: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..."));
}
答案 4 :(得分:4)
如果您不想使用@defining包装所有内容,可以执行以下操作:
@yourVariable = { yourValue }
@defining指令在模板中实际上是不可读的......
答案 5 :(得分:3)
有一个明显的解决方案看起来很干净,有时可能是首选的:在模板周围定义一个范围,在其中定义变量,让范围产生你需要的html代码,如下所示:
@{
val title = "Home"
<h1>Welcome on {title}</h1>
}
这有一些缺点:
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>"""))
}
}
}
...
答案 6 :(得分:1)
在旋转模板中,我建议使用定义块,因为
@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>
}
答案 7 :(得分: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
答案 8 :(得分:0)
@isExcel= {@Boolean.valueOf(java.lang.System.getProperty(SettingsProperties.isExcel))}