Ответ 1
@defining("foo") { title=>
<div>@title</div>
...
}
в основном, вы должны обернуть блок, в котором вы собираетесь его использовать.
Как вы объявляете и инициализируете переменную, которая будет использоваться локально в шаблоне 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
, не так ли?
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='[email protected]'>
^
<div id='[email protected]'></div>
^
</div>
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..."));
}
Если вы не хотите обертывать весь свой контент с помощью @defining, вы можете сделать это:
@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>"""))
}
}
}
...
@isExcel= {@Boolean.valueOf(java.lang.System.getProperty(SettingsProperties.isExcel))}
В шаблонах twirl я бы рекомендовал использовать определяющий блок, потому что
@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>
}