wake-up-neo.com

Blattblatt, Fragmente und Standardparameter

Ich habe eine fragmente.html Datei erstellt. Es enthält das folgende Fragment:

<div th:fragment="my_fragment(content)">
    <p th:text="${content}"></p>
</div>

Ich habe das obige Fragment in meine Ansichtsdatei eingefügt:

<div th:replace="fragments :: my_fragment('test')"></div>

Jetzt möchte ich zwei Parameter an my_fragment übergeben, aber ich muss die Abwärtskompatibilität sicherstellen.

Ich habe versucht, das Problem wie folgt zu lösen:

<div th:fragment="my_fragment(content, defaultParameter='default value')">
    <p th:text="${content}"></p>
</div>

Leider hat die obige Lösung einen Fehler generiert:

org.springframework.web.util.NestedServletException: Request Verarbeitung gescheitert; geschachtelte Ausnahme ist org.thymeleaf.exceptions.TemplateProcessingException: Kann nicht aufgelöst werden Fragment. Signatur "my_fragment (content, defaultParameter =" Standardwert ")" deklariert 2 Parameter, aber die Fragmentauswahl gibt 1 Parameter an . Die Fragmentauswahl stimmt nicht richtig überein.

Irgendeine Idee?

24
user3364391

Thymeleaf erlaubt die Signatur eines Fragments ohne explizite Parameter wie diese:

<div th:fragment="my_fragment">
    <p th:text="${content}"></p>
    <p th:text="${defaultParameter}"></p>
</div>

Um dieses Fragment aufzurufen und content und defaultParameter zu übergeben, können Sie das Fragment wie folgt aufrufen:

<!-- both parameters not specified -->
<div th:replace="fragments :: my_fragment"></div>
<!-- only content parameter specified -->
<div th:replace="fragments :: my_fragment(content='a')"></div>
<!-- both parameters specified -->
<div th:replace="fragments :: my_fragment(content='a', defaultParameter='b')"></div>

Aber das Folgende wird nicht funktionieren:

<div th:replace="fragments :: my_fragment('a', 'b')"></div>

Und die Botschaft ist selbsterklärend:

 Signature "my_fragment" declares no parameters, but fragment selection did specify parameters in a synthetic manner (without names), which is not correct due to the fact parameters cannot be assigned names unless signature specifies these names. 

Wenn Sie die Abwärtskompatibilität beibehalten möchten, sollten Sie beim Aufruf eines Fragments benannte Parameter verwenden und keine Parameter in einer Signatur eines Fragments angeben.

38
Rafal Borowiec

Um optionale Parameter für ein Fragment zuzulassen, empfiehlt es sich, sie mit "th: with" zu deklarieren und mit sinnvollen Standardwerten zu beschreiben. 

Sie definieren also explizit Ihre obligatorischen und optionalen Werte im Deklarationstag Ihres Fragments.

Hier ist ein einfaches Beispiel mit 1 obligatorischen und 2 optionalen Parametern:

<div th:fragment="printGreetings (name)" th:with="title=${title} ?: 'Mr.', greeting=${greeting} ?: 'Hello'">
    <span th:text="${greeting}">Hello</span>
    <span th:text="${title}">Mr.</span>
    <span th:text="${name}">John Doe</span>
</div>

Sie können es dann wie folgt aufrufen:

<div th:replace="fragments :: printGreetings (name='daniel')">
   Hello Mr. Daniel
</div>
<div th:replace="fragments :: printGreetings (name='Lea', title='Ms.')>
   Hello Ms. Lea
</div>
<div th:replace="fragments :: printGreetings (name='Lea', title='Ms.', 'Hi')>
   Hi Ms. Lea
</div>

(Bitte beachten Sie, dass alle Werte in den Tags durch die dynamischen ersetzt werden. Dies ist nur zur besseren Lesbarkeit.)

6
snap

Wenn Sie (wie in Ihrem Fall) einen Standardwert angeben möchten, können Sie mit dem elvis-Operator einen Standardwert angeben, beispielsweise:

<div th:fragment="my_fragment">
    <p th:text="${content}"></p>
    <p th:text="${defaultParameter ?: 'the backwards compat value'}"></p>
</div>

siehe: elvis-operator

3

Zum Schluss habe ich die Aufgabe so gelöst:

<div th:fragment="my_fragment2(content, param2)">
    <th:block th:replace="my_fragment(${content})"/>
</div>

<div th:fragment="my_fragment(content)" th:with="param2=${param2} ?: 'default value'">
    <p th:text="${content}"></p>
    <p th:text="${param2}"></p>
</div>

<div th:replace="fragments :: my_fragment2('test', 'my_value')"></div>

Aber es ist Overhead :( 

Stellen Sie auch eine Frage zur Ausgabe von Fragment-Parametern dürfen Standardwerte haben

0
GKislin