web-dev-qa-db-fra.com

Déclarer une variable dans un template Play2 scala

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"
54
travega
@defining("foo") { title=>
  <div>@title</div>
  ...
}

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

50
virtualeyes

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?

37
ollie

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>
14
Govind Singh

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..."));
}
11
biesior

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 ...

4
c4k

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:

  • vous générez votre code HTML en tant que Scala NodeSeq de cette façon, ce qui peut parfois être limitant
  • il y a un problème de performances avec cette solution: le code à l'intérieur de @{ 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>"""))
      }
    }
  }

...
2
Suma

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>
}
0
Code.IT
@isExcel= {@Boolean.valueOf(Java.lang.System.getProperty(SettingsProperties.isExcel))}
0
Eassa Nassar