Ja, ich glaube, dass Play Jungs es ernst meinen.
Erstens.
Welchen Sinn hat es, die Variable als eine hardcoded
Element der Vorlage? Ok, ich verstehe, dass Sie den einen Wert nicht mehrmals einfügen wollen, aber die Art und Weise, die Sie mit @defining
löst das Problem. Andererseits - wenn Sie die Variable nur für die Verwendung als Bedingung in der if
Block, macht das auch keinen Sinn, denn man kann auch einfach etwas schreiben wie @if(1==1){ code }
um ein bestimmtes Verhalten zu simulieren. In anderen Fällen sollten die Variablen von der Steuerung bestimmt werden, und um das zu verdeutlichen, kann man als Beispiel eine Map zur Übergabe von Variablengruppen von controllers
zum view
.
Zweitens.
Scala-Vorlagen in Play sind nur Funktionen, das heißt, Sie können auch andere Funktionen oder Methoden aufrufen. Sie können zum Beispiel einige getter
oder eine andere Methode, die das tut und alles zurückgibt, was Sie wollen. Es gibt viele Beispiele, daher überspringe ich diesen Teil.
Drittens.
Wie im zweiten Teil erwähnt, wenn Sie nicht mögen der @defining-Ansatz, können Sie einfach ein paar supereinfache Methoden irgendwo in Ihrer Anwendung erstellen (nehmen wir an, das ist app/controllers/Application.java
) zum Speichern und Setzen/Abrufen eines Wertes. Wenn Sie viele "Variablen" verwenden möchten, ist es natürlich besser, sie in einer Map zu speichern, anstatt für jede einzelne einen Getter und Setter zu erstellen.
in Ihrem Application
Controller, fügen Sie einfach diese einfachen Methoden hinzu (erstellen Sie bei Bedarf auch eigene Getter für andere Typen)
private static Map<String, Object> map = new HashMap<String, Object>();
// setter
public static void setValue(String key, Object value) {
map.put(key, value);
}
// general getter would work well with String, also numeric types (only for displaying purposes! - not for calculations or comparisons!)
public static Object getValue(String key) {
return map.get(key);
}
public static Boolean isTrue(String key) {
return Boolean.valueOf(map.get(key).toString());
}
public static Double getDouble(String key) {
return Double.valueOf(map.get(key).toString());
}
Als Nächstes können Sie es also in Ihrem view
durch Setzen und Lesen der Map-Schlüssel und -Werte
@Application.setValue("name", "Stefan")
@Application.setValue("age", 30)
@Application.setValue("developer", false)
@Application.setValue("task1", 123.5)
@Application.setValue("task2", 456.7)
<h1>ellou' @Application.getValue("name")!</h1>
<div>
Today there are your @Application.getValue("age") birthday!
</div>
<div>
You are @if( Application.isTrue("developer") ) {
very big developer
} else {
just common user
}
</div>
<div>
Once again: @{ val status = if (Application.isTrue("developer")) "veeeeery big developer" else "really common user"; status }
</div>
<div>
Today you earned $ @{ Application.getDouble("task1") + Application.getDouble("task2") }
</div>
<div> etc... </div>
Wie Sie sehen können, können Sie sogar einige grundlegende Operationen durchführen, trotzdem würde ich für anspruchsvollere Aufgaben das Gewicht von der (nur) Template-Engine auf die Methoden des dedizierten Controllers umleiten.