如何在Play2 Scala模板中声明和初始化变量以供局部使用?
我有以下代码:
@var title : String = "Home"
我将模板顶部声明了它,但是它给了我这个错误:
illegal start of simple expression """),_display_(Seq[Any](/*3.2*/var)),format.raw/*3.5*/(""" title : String = "Home"
如何在Play2 Scala模板中声明和初始化变量以供局部使用?
我有以下代码:
@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的解决方案是有效的(而且非常方便),只要您之后不尝试更改变量的值,是吗?
您只需要将此放置在模板顶部:
@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
时才相关,不是吗?
@for
里面它不起作用。但是它不需要在文件的最顶部。 - nafg@defining
感觉很棒。@defining
指令根本不可读。 - yerlilbilginScala模板支持此功能,您可以在模板中定义变量。
@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的解决方案是正确的,但也有其他可能,你可以像通常一样声明视图参数并设置默认值,在这种情况下,您将在整个模板中使用它+您仍然可以从控制器更改它的值:
@(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("foo")
展示了两种可能的方法,第三种选择是不存在的。 - biesior@defining
吗?这很短视...无论如何,感谢您的输入。 - travega@defining
就可以了,再次感谢您的建议。 - travega@yourVariable = { yourValue }
@defining指令在模板中确实很难读懂...
有一个显而易见的解决方案,看起来非常干净,有时可能更受欢迎:在模板周围定义一个作用域,在其中定义您的变量,并让该作用域生成所需的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>"""))
}
}
}
...
@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>
}
@(title:String)(implicit session:play.api.mvc.Session)
@import java.math.BigInteger; var i=1; var k=1
工作正常。
但是,如果将包含变量over的导入语句写在导入语句之前:
@import java.math.BigInteger; var i=1; var k=1
@(title:String)(implicit session:play.api.mvc.Session)
对我没有起作用,导致了错误:
expected class or object definition
@isExcel= {@Boolean.valueOf(java.lang.System.getProperty(SettingsProperties.isExcel))}