在Play2 Scala模板中声明variables

如何声明和初始化Play2 Scala模板中本地使用的variables?

我有这个:

@var title : String = "Home" 

声明在模板的顶部,但它给了我这个错误:

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

基本上,你必须包装你要使用它的块

实际上,@ c4k的解决scheme正在工作(而且相当方便),只要你不想在之后改变variables的值,不是吗?

您只需将其放在模板的顶部即可:

 @yourVariable = {yourValue} 

或者,如果这是一个更复杂的expression,你可以这样做:

 @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> 

在你说的评论中,它被input到HTMLtypes。 但是,只有当你试图再次覆盖@title才是相关的,不是吗?

scala模板支持这个,你可以在模板中定义variables

 @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> 

virtualeyes的解决scheme是正确的,但也有其他的可能性,你可以像默认值一样声明一个视图的参数,在这种情况下,你可以使用整个模板+你可以改变它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...")); } 

如果你不想用@defining包装所有的内容,你可以这样做:

 @yourVariable = { yourValue } 

@defining指令在模板中真的不可读

有一个显而易见的解决scheme,它看起来很干净,有时候可能是首选:定义一个围绕模板的范围,在里面定义你的variables,让范围产生你需要的html代码,如下所示:

 @{ val title = "Home" <h1>Welcome on {title}</h1> } 

这有一些缺点:

  • 你这样生成你的html作为Scala NodeSeq ,这可能有时是有限的
  • 这个解决scheme有一个性能问题: @{里面的代码似乎是编译运行时,因为为页面生成的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>""")) } } } ... 
 @isExcel= {@Boolean.valueOf(java.lang.System.getProperty(SettingsProperties.isExcel))}