在Play2 scala模板中声明变量

tra*_*ega 56 html templates scala playframework playframework-2.0

如何声明和初始化要在Play2 Scala模板中本地使用的变量?

我有这个:

@var title : String = "Home"
Run Code Online (Sandbox Code Playgroud)

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

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

vir*_*yes 53

@defining("foo") { title=>
  <div>@title</div>
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • "foo"是什么意思?不是单词本身,而是使用此参数的位置? (8认同)
  • "foo"是要评估的表达方式.您可以使用元组执行诸如"@defining((1,2,3)){case(a,b,c)=> ...}"之类的操作,传入您喜欢的任何scala表达式.工作,但是在...中定义一个val就像你在普通的scala代码中所做的那样令人痛苦 (3认同)
  • "foo"是参数.title获取String"foo"值.您还可以使用列表或任何其他类型作为参数. (2认同)

小智 40

实际上,@ c4k的解决方案正在工作(并且相当方便),只要你之后不尝试改变变量的值,不是吗?

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

@yourVariable = {yourValue}
Run Code Online (Sandbox Code Playgroud)

或者,如果它是一个更复杂的表达式,你这样做:

@yourVariable = @{yourExpression}
Run Code Online (Sandbox Code Playgroud)

你甚至可以使用像这样的列表之类的东西:

@(listFromController: List[MyObject])
@filteredList = @{listFromController.filter(_.color == "red")}

@for(myObject <- filteredList){ ... }
Run Code Online (Sandbox Code Playgroud)

对于给定的示例,这将是

@title = {Home}  //this should be at beginning of the template, right after passing in parameters

<h1> Using title @title </h1>
Run Code Online (Sandbox Code Playgroud)

在你说的评论中,它被输入到HTML类型.但是,这只是在你@title再次尝试覆盖时才有意义,不是吗?

  • 显然它在`@ for`中不起作用.但是,它不需要一直在文件的顶部. (2认同)
  • 谢谢!!!使用它而不是`@defining` 感觉很棒。`@defining` 指令根本不可读 (2认同)
  • 哪里记录了您可以使用花括号分配变量? (2认同)

Gov*_*ngh 15

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

@import java.math.BigInteger; var i=1; var k=1
Run Code Online (Sandbox Code Playgroud)

如果要在模板中更改其值

@{k=2}
Run Code Online (Sandbox Code Playgroud)

@(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>
Run Code Online (Sandbox Code Playgroud)


bie*_*ior 11

virtualeyes的解决方案是正确的,但也有其他可能性,您可以通常使用默认值声明视图的参数,在这种情况下,您可以将其用于整个模板+您将保留更改它的可能性的controller:

@(title: String = "Home page")

<h1>Welcome on @title</h1>
Run Code Online (Sandbox Code Playgroud)

控制器:

def index = Action{
    Ok(views.html.index("Other title"))
}
Run Code Online (Sandbox Code Playgroud)

请注意,Java控制器无法识别模板的默认值,因此您需要每次都添加它们:

public static Result index(){
    return ok(views.html.index.render("Some default value..."));
}
Run Code Online (Sandbox Code Playgroud)


c4k*_*c4k 5

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

@yourVariable = { yourValue }
Run Code Online (Sandbox Code Playgroud)

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

  • 这将把你的变量变成一个 html thingie (5认同)
  • 确切地说,这并不能解决问题。我在我的模板中尝试过,然后这样声明的“变量”被输入为 HTML 类型。 (3认同)