wake-up-neo.net

Deklarieren Sie die Variable in einer Play2-Scala-Vorlage

Wie deklarieren und initialisieren Sie eine Variable, die lokal in einer Play2 Scala-Vorlage verwendet werden soll?

Ich habe das:

@var title : String = "Home"

oben in der Vorlage angegeben, aber es wird folgende Fehlermeldung angezeigt:

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

im Grunde müssen Sie den Block umschließen, in dem Sie ihn verwenden werden

50
virtualeyes

Die Lösung von @ c4k funktioniert (und ist sehr praktisch), solange Sie nicht versuchen, den Wert der Variablen nachträglich zu ändern.

Sie platzieren dies einfach oben in Ihrer Vorlage:

@yourVariable = {yourValue}

oder, wenn es sich um einen komplizierteren Ausdruck handelt, tun Sie Folgendes:

@yourVariable = @{yourExpression}

Sie können sogar mit solchen Listen arbeiten:

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

@for(myObject <- filteredList){ ... }

Für das gegebene Beispiel wäre das

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

<h1> Using title @title </h1>

In den Kommentaren, die Sie gesagt haben, wird in HTML-Typ geschrieben. Dies ist jedoch nur relevant, wenn Sie erneut versuchen, @title zu überschreiben, oder?

37
ollie

scala template unterstützt dies, Sie können Variablen in der Vorlage definieren 

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

wenn Sie den Wert in der Vorlage ändern möchten

@{k=2}

beispiel

@(title:String)(implicit session:play.api.mvc.Session)
@import Java.math.BigInteger; var i=1; var k=1
^
<div id='[email protected]'>
                     ^
  <div id='[email protected]'></div>
                     ^
</div>
14
Govind Singh

die Lösung von virtualeyes ist die richtige, aber es gibt auch eine andere Möglichkeit. Sie können den Parameter einer Ansicht wie gewöhnlich mit dem Standardwert deklarieren. In diesem Fall haben Sie sie für die gesamte Vorlage zur Verfügung der controller:

@(title: String = "Home page")

<h1>Welcome on @title</h1>

regler:

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

Beachten Sie, dass der Java-Controller die Standardwerte der Vorlagen nicht erkennt. Sie müssen sie also jedes Mal hinzufügen:

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

Wenn Sie Ihren gesamten Inhalt nicht mit @defining umschließen möchten, können Sie Folgendes tun:

@yourVariable = { yourValue }

Die @ defining-Direktive ist in einer Vorlage wirklich unlesbar ...

4
c4k

Es gibt eine offensichtliche Lösung, die recht sauber aussieht und manchmal bevorzugt wird: Definieren Sie einen Bereich um die Vorlage, definieren Sie Ihre Variable darin und lassen Sie den Gültigkeitsbereich den HTML-Code erzeugen, den Sie benötigen:

@{
  val title = "Home"

  <h1>Welcome on {title}</h1>
}

Dies hat einige Nachteile:

  • sie generieren Ihre HTML-Datei als Scala NodeSeq auf diese Weise, was manchmal einschränkend sein kann
  • es gibt ein Leistungsproblem bei dieser Lösung: Der Code in @{ scheint zur Laufzeit kompiliert zu werden, da der für die Seite generierte Scala-Code wie folgt aussieht (einige übliche Twirl-Sachen wurden gelöscht):

Der generierte Code:

...    

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

In Wirbelvorlagen würde ich empfehlen, den Definitionsblock zu verwenden, weil das

@random = @{
     new Random().nextInt
}

<div id="@random"></div>
<div id="@random"></div>

führt bei mehrmaliger Verwendung zu unterschiedlichen Werten!

@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