Déclarez la variable dans un modèle de Scala Play2

Comment déclarer et initialiser une variable à utiliser localement dans un modèle Play2 Scala?

J’ai ceci:

@var title : Ssortingng = "Home" 

déclaré en haut du template, mais cela me donne cette erreur:

 illegal start of simple expression """),_display_(Seq[Any](/*3.2*/var)),format.raw/*3.5*/(""" title : Ssortingng = "Home" 

 @defining("foo") { title=> 
@title
... }

fondamentalement, vous devez envelopper le bloc dans lequel vous allez l’utiliser

En fait, la solution de @ c4k fonctionne (et est très pratique) tant que vous n’essayez pas de modifier la valeur de la variable par la suite, n’est-ce pas?

Vous placez simplement cela en haut de votre modèle:

 @yourVariable = {yourValue} 

ou, si c’est une expression plus compliquée, vous faites ceci:

 @yourVariable = @{yourExpression} 

Vous pouvez même travailler avec des choses comme des listes comme celles-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 

Using title @title

Dans les commentaires que vous avez dit, il est tapé au type HTML. Cependant, cela n'est pertinent que si vous essayez de réécrire @title , n'est-ce pas?

scala template support this this, vous pouvez définir la variable dans le template

 @import java.math.BigInteger; var i=1; var k=1 

si vous voulez changer sa valeur dans le modèle

 @{k=2} 

Exemple

 @(title:Ssortingng)(implicit session:play.api.mvc.Session) @import java.math.BigInteger; var i=1; var k=1 ^ 
^
^

la solution de virtualeyes est la bonne, mais il y a aussi une autre possibilité, vous pouvez simplement déclarer le param d’une vue comme d’habitude avec une valeur par défaut, dans ce cas vous l’aurez disponible pour tout le template + vous pourrez le changer de le controller :

 @(title: Ssortingng = "Home page") 

Welcome on @title

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 append à chaque fois:

 public static Result index(){ return ok(views.html.index.render("Some default value...")); } 

Si vous ne voulez pas envelopper tout votre contenu avec @defining, vous pouvez le faire:

 @yourVariable = { yourValue } 

La directive @defining est vraiment illisible dans un modèle …

Il y a une solution évidente qui semble assez propre et que l’on peut parfois préférer: définir une scope autour du modèle, définir sa variable à l’intérieur et laisser l’étendue produire le code HTML dont vous avez besoin, comme ceci:

 @{ val title = "Home" 

Welcome on {title}

}

Cela a des inconvénients:

  • vous générez votre HTML comme Scala NodeSeq cette façon, ce qui peut être parfois limitant
  • il y a un problème de performance avec cette solution: le code à l’intérieur de @{ semble être un runtime compilé, parce que le code Scala généré pour la page est comme ça (des choses Twirl habituelles sont supprimées):

Le code généré:

 ... Seq[Any](format.raw/*1.1*/("""    Basic Twirl   """),_display_(/*9.10*/{ val title = "Home" 

Welcome on {title}

}),format.raw/*15.10*/(""" """),format.raw/*17.5*/(""" """)) } } } ...
 @isExcel= {@Boolean.valueOf(java.lang.System.getProperty(SettingsProperties.isExcel))}