Comment déclarer et initialiser une variable à utiliser localement dans un modèle Play2 Scala?
J'ai ceci:
@var title : String = "Home"
déclaré en haut du modèle, mais il me donne cette erreur:
illegal start of simple expression """),_display_(Seq[Any](/*3.2*/var)),format.raw/*3.5*/(""" title : String = "Home"
@defining("foo") { title=>
<div>@title</div>
...
}
fondamentalement, vous devez envelopper le bloc dans lequel vous allez l'utiliser
En fait, la solution de @ c4k fonctionne (et très pratique) tant que vous n'essayez pas de changer la valeur de la variable par la suite, n'est-ce pas?
Vous placez simplement ceci en haut de votre modèle:
@yourVariable = {yourValue}
ou, si c'est une expression plus compliquée, faites ceci:
@yourVariable = @{yourExpression}
Vous pouvez même travailler avec des choses comme des listes comme celle-ci:
@(listFromController: List[MyObject])
@filteredList = @{listFromController.filter(_.color == "red")}
@for(myObject <- filteredList){ ... }
Pour l'exemple donné, ce serait
@title = {Home} //this should be at beginning of the template, right after passing in parameters
<h1> Using title @title </h1>
Dans les commentaires que vous avez dit, cela doit être typé en HTML. Cependant, cela n’est pertinent que si vous essayez de réécrire @title
, n’est-ce pas?
le modèle scala le permet, vous pouvez définir une variable dans le modèle
@import Java.math.BigInteger; var i=1; var k=1
si vous voulez changer sa valeur dans template
@{k=2}
exemple
@(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>
la solution de virtualeyes est la bonne, mais il y a aussi une autre possibilité, vous pouvez simplement déclarer le paramètre d'une vue comme ayant généralement la valeur par défaut. Dans ce cas, vous l'aurez disponible pour le modèle entier + vous aurez la possibilité de le modifier la controller
:
@(title: String = "Home page")
<h1>Welcome on @title</h1>
manette:
def index = Action{
Ok(views.html.index("Other title"))
}
Notez que le contrôleur Java ne reconnaît pas les valeurs par défaut des modèles. Vous devez donc les ajouter à chaque fois:
public static Result index(){
return ok(views.html.index.render("Some default value..."));
}
Si vous ne voulez pas encapsuler tout votre contenu avec @defining, vous pouvez faire ceci:
@yourVariable = { yourValue }
La directive @defining est vraiment illisible dans un template ...
Il existe une solution évidente qui semble assez simple et peut parfois être préférée: définissez une portée autour du modèle, définissez votre variable à l'intérieur de celle-ci et laissez la portée produire le code html dont vous avez besoin, comme ceci:
@{
val title = "Home"
<h1>Welcome on {title}</h1>
}
Cela a quelques inconvénients:
NodeSeq
de cette façon, ce qui peut parfois être limitant@{
semble être un environnement compilé, car le code Scala généré pour la page ressemble à ceci (certains éléments de Twirl habituels ont été supprimés):Le code généré:
...
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>"""))
}
}
}
...
Dans les gabarits, je recommanderais l’utilisation du bloc de définition, car
@random = @{
new Random().nextInt
}
<div id="@random"></div>
<div id="@random"></div>
entraînerait des valeurs différentes lorsqu’il est utilisé plusieurs fois!
@defining(new Random().nextInt){ random =>
<div id="@random"></div>
<div id="@random"></div>
}
@isExcel= {@Boolean.valueOf(Java.lang.System.getProperty(SettingsProperties.isExcel))}