2016-05-16 5 views
2

Ich habe eine Vorlage wie folgt aus:Wie kann ich dieses Template-Snippet von Thymeleaf 2.1.4 auf Thymeleaf 3.0 migrieren?

<table th:with="isEven=false"> 
     <tr th:if="*{foo} != null" class='odd' th:class="${isEven=!isEven}?'even':'odd'"> 
     foo 
     </tr> 
     <tr th:if="*{bar} != null" class='odd' th:class="${isEven=!isEven}?'even':'odd'"> 
     bar 
     </tr> 
</table> 

Es mit Thymeleaf arbeitete 2.1.4 aber mit 3.0.0 wirft es die folgende Ausnahme:

org.thymeleaf.exceptions.TemplateProcessingException: 
    Exception evaluating OGNL expression: "isEven=!isEven" (template: "foo" - line 10, col 34) 

Caused by: java.lang.UnsupportedOperationException: 
    Cannot set values into VariablesMap instances from OGNL Expressions 

Jede Idee, wie dieses Problem beheben?

Hinweis: Dies ist keine Schleife, so gibt es kein varStat Objekt wie in

<tr th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'">

Die <tr> auf dem th:if Zustand erzeugte abhängig und ich würde eine wie auch haben/Seltsame Umschaltung für sie.

Bearbeiten: Ich öffnete eine Github issue für dieses Problem.

Antwort

1

Thymeleaf 3 erlaubt keine Änderung von Kontextvariablen als Lateral-Effekt von OGNL/SpringEL-Ausdrücken (was tatsächlich in 2.1 falsch erlaubt ist).

Aber wenn ich Ihren Code richtig verstehe, sollten Sie die Flags, die Sie benötigen, in einer th:with erstellen können. So etwas wie das:

<table th:with="hasFoo=(*{foo} != null)"> 
     <tr th:if="${hasFoo}" class='even'> 
     foo 
     </tr> 
     <tr th:if="*{bar} != null" class='odd' th:class="${hasFoo}? even : odd"> 
     bar 
     </tr> 
</table> 
+0

Das hilft nicht viel, da es viele und viele andere Variablen gibt, die 'foo' und' bar' folgen. Es ist beabsichtigt, etwas "zu drucken", wenn der Inhalt nicht leer ist, und zwar mit einer alternierenden "gerade"/"ungeraden" Klasse in der erzeugten Ausgabe. Ich brauche im Wesentlichen einen 'varStat', aber ohne umschließende Schleife, etwas ein bisschen wie ein" manueller "varStat. – Huxi

+0

In diesem Fall scheint es die am besten geeignete Lösung zu sein, eine Bean zu erstellen, die Sie in Ihren Kontext aufnehmen, und welche Methoden Sie aus Ihren Ausdrücken aufrufen können, um einen Index zurückzugeben (und eine andere Methode, um zu sagen, ob sie gerade oder ungerade ist)). Ähnlich wie varStat, aber manuell hinzugefügt. –