Объявить переменную в шаблоне Play2 scala
Как вы объявляете и инициализируете переменную, которая будет использоваться локально в шаблоне Play2 Scala?
у меня есть это:
@var title : String = "Home"
объявлен в верхней части шаблона, но это дает мне эту ошибку:
illegal start of simple expression """),_display_(Seq[Any](/*3.2*/var)),format.raw/*3.5*/(""" title : String = "Home"
7 ответов:
@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
опять же, не так ли?
шаблон скала поддерживает это, вы можете определить переменную в шаблоне
@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 является правильным, но есть и другая возможность, вы можете просто объявить параметр представления, как обычно, со значением по умолчанию, в таком случае у вас будет он доступен для всего шаблона + вы сохраните возможность его изменения из
controller
:@(title: String = "Home page") <h1>Welcome on @title</h1>
Если вы не хотите, чтобы обернуть все содержимое с @defining, вы можете сделать это:
@yourVariable = { yourValue }
директива @defining действительно не читается в шаблоне...
есть одно очевидное решение, которое выглядит довольно чистым и иногда может быть предпочтительным: определите область вокруг шаблона, определите свою переменную внутри него, и пусть область создает необходимый вам html-код, например:
@{ val title = "Home" <h1>Welcome on {title}</h1> }
это имеет некоторые недостатки:
- вы создаете свой html как Scala
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>""")) } } } ...