2 Stimmen

play 2.0 eine Variable erstellen und Werte zuweisen

Ich habe viel nach diesem Thema gesucht. Ich möchte nur eine Variable in einer Scala-HTML-Vorlage erstellen und brauchte eine temporäre Variable.

Die einzige Lösung, die ich gefunden habe und die "Sinn" macht, ist die folgende:

@defining("hello text") {testvariable =>
    <h1>output of variable: @testvariable</h1>
}

Ist das wirklich der einzige Weg? Meinen die Jungs von playframework das ernst? Ich möchte keinen Variablenwert vom Controller an die Vorlage weitergeben. Ich möchte nur eine lokale einfache Variable erstellen und ihr in einem "if-Block" einen Wert zuweisen, sonst nichts.

4voto

biesior Punkte 55167

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.

0voto

jon-hanson Punkte 7951

In diesem Beispiel wird kein Variablenwert vom Controller an die Vorlage übergeben. Es ist die Bindung eines Wertes an eine Variable, damit sie innerhalb des Geltungsbereichs der nachfolgenden geschweiften Klammern wiederverwendet werden kann, was genau das zu sein scheint, was Sie wollen. D.h. Sie würden diesen Code in einer Vorlage verwenden und durch die Bindung von "hallo Text" an testvariable würde es ergeben:

<h1>output of variable: hello world</h1>

Das heißt, es hat nichts mit Controllern zu tun.

Wenn Sie einige Vorlage Code, wo Sie versuchen, es zu benutzen, könnten wir in der Lage sein zu helfen.

0voto

Oskar Andersson Punkte 61

Entschuldigung, dass ich einen Zombie erschaffe... Aber da ich auf der Suche nach mir selbst hier gelandet bin, wollte ich einen Beitrag leisten, indem ich meine bevorzugte Alternative, Biesiors zweite Alternative (mit einem trivialen Streifenreihenbeispiel), näher erläutere:

/** This goes in the top of the scala template, before the HTML **/
@injectStripeColor(index: Integer) = @{
    if(index % 2 == 0){
        "#EEE" // Even row
    } else {
        "#AAA" // Odd row
    }
}

Sie haben nun eine Funktion, die Sie in Ihrer Vorlage verwenden können. (Sie können die obige Funktion auch in einer separaten Datei speichern, die Sie immer dann einbinden, wenn Sie sie in einer beliebigen Vorlage benötigen).

/** This goes in your row loop where i is current index **/
<tr><td style="background-color: @injectStripeColor(i)"> @content </td></tr>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X