html scala templates playframework playframework-2.0

html - Declarar variable en una plantilla de scala de Play2



templates playframework (7)

¿Cómo declaras e inicializas una variable para usar localmente en una plantilla de Play2 Scala?

Tengo esto:

@var title : String = "Home"

declarado en la parte superior de la plantilla, pero me da este error:

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


En realidad, la solución de @ c4k está funcionando (y es bastante conveniente) siempre y cuando no intentes cambiar el valor de la variable después, ¿no?

Simplemente coloque esto en la parte superior de su plantilla:

@yourVariable = {yourValue}

o, si es una expresión más complicada, haz esto:

@yourVariable = @{yourExpression}

Incluso puede trabajar con cosas como listas como esa:

@(listFromController: List[MyObject]) @filteredList = @{listFromController.filter(_.color == "red")} @for(myObject <- filteredList){ ... }

Para el ejemplo dado, esto sería

@title = {Home} //this should be at beginning of the template, right after passing in parameters <h1> Using title @title </h1>

En los comentarios que dices, se escribe a tipo de HTML. Sin embargo, eso solo es relevante si intenta sobrescribir @title nuevamente, ¿no es así?


Hay una solución obvia que parece bastante limpia y puede ser preferible a veces: definir un alcance alrededor de la plantilla, definir su variable dentro de ella y dejar que el alcance produzca el código html que necesita, como este:

@{ val title = "Home" <h1>Welcome on {title}</h1> }

Esto tiene algunos inconvenientes:

  • está generando su html como Scala NodeSeq esta manera, que a veces puede estar limitando
  • hay un problema de rendimiento con esta solución: el código dentro de @{ parece ser el tiempo de compilación compilado, porque el código de Scala generado para la página tiene este aspecto (algunas cosas típicas de Twirl son borradas):

El código generado:

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


La plantilla scala lo admite, puede definir variables en la plantilla

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

Si desea cambiar su valor de plantilla, puede hacerlo

@{k=2}

ejemplo

@(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 solución de virtualeyes es la adecuada, pero también hay otra posibilidad, puede declarar el parámetro de una vista como generalmente con valor predeterminado, en tal caso lo tendrá disponible para toda la plantilla + tendrá la posibilidad de cambiarlo de el controller :

@(title: String = "Home page") <h1>Welcome on @title</h1>

controlador:

def index = Action{ Ok(views.html.index("Other title")) }

Tenga en cuenta que el controlador de Java no reconoce los valores predeterminados de las plantillas, por lo que debe agregarlos cada vez:

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


Si no desea ajustar todo su contenido con @definición, puede hacer esto:

@yourVariable = { yourValue }

La directiva @defining es realmente ilegible en una plantilla ...


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

básicamente, tienes que envolver el bloque en el que vas a usarlo


@isExcel= {@Boolean.valueOf(java.lang.System.getProperty(SettingsProperties.isExcel))}