Pytanie Instrukcja przełącznika Thymleaf z wieloma przypadkami


W skrócie

Chcę mieć instrukcję switch w thymeleaf z logiką po napisaniu do wielu instrukcji case.

Szczegółowo

Chcę to wdrożyć w thymeleaf

switch(status.value){
  case 'COMPLETE':
  case 'INVALID':
     //print exam is not active
     break;
  case 'NEW':
     //print exam is new and active
     break;
}

Mój aktualny kod thymleaf, który kończy się niepowodzeniem z błędem wykonania

 <div th:switch="${status.value}">
      <div th:case="'COMPLETE','INVALID'">
         <!-- print object is not active -->
      </div>
      <div th:case="NEW'">
         <!-- print object is new and active -->
      </div>
 </div>                             

Ale powyższy kod nie powiedzie się z powodu błędu

org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "'COMPLETE','INVALID'"...

Uwaga: znam przyczynę powyższego komunikatu o błędzie. Wszystko, czego potrzebuję, to znać sposób implementacji przełącznika z wieloma przypadkami dla pojedynczego wyjścia


11
2018-04-15 18:09


pochodzenie


Nie ma sposobu, aby zrobić to tak, jak chcesz. Po prostu używaj fragmentów w obu przypadkach, jeśli chcesz uniknąć powielania kodu, jak stwierdził pens-fan-69. - Ostap Gonchar


Odpowiedzi:


Niepowodzenie wynika z faktu, że nie masz prawidłowego wyrażenia w pierwszym przypadku. Konkretnie,

'COMPLETE','INVALID'

nie jest prawidłowym wyrażeniem. Podejrzewam, że to, co próbujesz zrobić, to element div, jeśli status jest ZUPEŁNY lub NIEPRAWIDŁOWY. Niestety, uważam, że będziesz musiał duplikować znaczniki indywidualnie dla tych warunków. Pozwól mi zaproponować następujący znacznik:

<!-- th:block rather than unneeded div -->
<th:block th:switch="${status.value}">
    <div th:case="'COMPLETE'">
        <!-- print object is not active -->
    </div>
    <div th:case="'INVALID'">
        <!-- print object is not active -->
    </div>
    <div th:case="'NEW'">
        <!-- print object is new and active -->
    </div>
</th:block>

Ewentualnie możesz odwołać się do Th: jeśli to faktycznie może działać lepiej w tym przypadku:

<div th:if="${status.value} eq 'COMPLETE' or ${status.value} eq 'INVALID'">
    <!-- print object is not active -->
</div>
<div th:if="${status.value} eq 'NEW'">
    <!-- print object is new and active -->
</div>

Albo jeszcze prostszy:

<div th:unless="${status.value} eq 'NEW'">
    <!-- print object is not active -->
</div>
<div th:if="${status.value} eq 'NEW'">
    <!-- print object is new and active -->
</div>

25
2018-04-15 18:55



Tak, wiem, że to nie jest prawidłowe wyrażenie. Wysłałem do wyjaśnienia mojej potrzeby w szczególności. Dziękuję za Twoją odpowiedź. Aktualnie używam obecnie th:if w mojej aplikacji. - Faraj Farook
Cóż, w takim przypadku myślę, że masz już najlepsze wdrożenie. Niestety nie ma "upadku" dla wielu przypadków w Thymeleaf, tak jak jest w Javie, chyba że chcesz wykorzystać domyślny przypadek (który mógłbyś w tym przypadku, chociaż nie poprawiłoby to znaczników zbytnio nad / jeśli nie). Jedną z opcji ograniczenia duplikowania kodu, jeśli masz wiele przypadków i chcesz użyć przełącznika, byłoby użycie fragmentu dla przypadków, które powinny mieć ten sam znacznik. - pens-fan-69
Istnieje również możliwość domyślnego przypadku (co jest prawie dobrym pomysłem na swtich / case, po prostu umieść to na końcu: <div th: case = "*"> Dla wszystkich innych (nieokreślonych) przypadków </ div> - snap