Thymeleaf: jak używać warunków warunkowych do dynamicznego dodawania / usuwania klas CSS

99

Używając Thymeleaf jako silnika szablonów, czy można dynamicznie dodawać / usuwać klasę CSS do / z prostego divz th:ifklauzulą?

Zwykle mógłbym użyć klauzuli warunkowej w następujący sposób:

<a href="lorem-ipsum.html" th:if="${condition}">Lorem Ipsum</a> 

Będziemy tworzyć łącze do strony lorem ipsum , ale tylko wtedy, gdy klauzula warunku jest prawdziwa.

Szukam czegoś innego: chciałbym, żeby klocek był zawsze widoczny, ale ze zmiennymi klasami w zależności od sytuacji.

vdenotaris
źródło

Odpowiedzi:

247

Jest też th:classappend.

<a href="" class="baseclass" th:classappend="${isAdmin} ? adminclass : userclass"></a>

Jeśli isAdmintak true, to spowoduje:

<a href="" class="baseclass adminclass"></a>
nilsi
źródło
3
Myślę, że to powinna być akceptowana odpowiedź. th:classzastępuje / przepisuje atrybut klasy. th:classappendjest tym, czego chcesz.
Aboodz
Alternatywnie możesz po prostu wstrzyknąć do modelu żądaną klasę ze sterownika, a potem miećth:classappend="${theRightClass}"
demaniak
1
Jeszcze jedną rzeczą do zapamiętania jest to, że niestety nie możesz mieć wielu th:classappendatrybutów. Maksymalnie jeden jest dozwolony. Fatal error during parsing org.xml.sax.SAXParseException: Attribute "th:classappend" was already specified for element "img".
user1053510
Czy nie ma th:classremovekonieczności usuwania pojedynczej klasy bez wpływania na inne lub sztywnego kodowania całej listy klas w wiążącym pliku XML? A może jedyną drogą jest pozostawienie jakiejkolwiek dynamicznej klasy wyłączonej i warunkowe dołączenie?
Drazen Bjelovuk
Jak to zrobić, jeśli trzeba zmienić więcej niż 2 klasy
Sineth Lakshitha
34

Tak, można dynamicznie zmieniać klasę CSS w zależności od sytuacji, ale nie za pomocą th:if. Odbywa się to za pomocą operatora elvis .

<a href="lorem-ipsum.html" th:class="${isAdmin}? adminclass : userclass">Lorem Ipsum</a> 
Michiel Bijlsma
źródło
link uszkodzony. nigdy wcześniej nie słyszałem o elvisie. czy pogodziłeś się
localhoost
@atilkan: Możesz po prostu wygooglować operator Elvisa i zobaczyć, że jest to wariant operatora potrójnego. Nawet wikipedia wyjaśnia to w pierwszych kilku wierszach: en.wikipedia.org/wiki/Elvis_operator
Kenny
7

W tym celu i jeśli nie mam zmiennej boolowskiej, używam:

<li th:class="${#strings.contains(content.language,'CZ')} ? active : ''">
Fleky
źródło
5

Inną bardzo podobną odpowiedzią jest użycie „równa się” zamiast „zawiera”.

<li th:class="${#strings.equals(pageTitle,'How It Works')} ? active : ''">
oświetlony
źródło
4

Jeśli chcesz tylko dołączyć klasę w przypadku błędu, możesz użyć th:errorclass="my-error-class"wspomnianego w dokumencie .

<input type="text" th:field="*{datePlanted}" class="small" th:errorclass="fieldError" />

Zastosowany do tagu pola formularza (input, select, textarea…), odczyta nazwę pola do zbadania z dowolnej istniejącej nazwy lub atrybutu th: field w tym samym tagu, a następnie doda określoną klasę CSS do tagu jeśli z takim polem są powiązane błędy

Stephane L.
źródło
2

Dodam tylko własną opinię, na wypadek gdyby komuś się przydała. To jest to, czego użyłem.

<div th:class="${request.read ? 'mdl-color-text--grey-800 w500' : ''}"> </div>
Charles
źródło
2

Jeszcze inne użycie th: class, tak samo jak @NewbLeech i @Charles, ale uproszczone do maksimum, jeśli nie ma przypadku „innego”:

<input th:class="${#fields.hasErrors('password')} ? formFieldHasError" />

Nie obejmuje atrybutu klasy, jeśli # fields.hasErrors ('password') ma wartość false.

Adrian Adamczyk
źródło
1

To, o czym wspomniał @Nilsi, jest całkowicie poprawne. Jednak klasa adminclass i klasa użytkownika muszą być opakowane w pojedyncze cudzysłowy, ponieważ może to się nie powieść, ponieważ Thymeleaf szuka zmiennych adminClass lub userclass, które powinny być łańcuchami. To mówi,

powinno być: -

 <a href="" class="baseclass" th:classappend="${isAdmin} ? 'adminclass' : 
 'userclass'"> 
 </a>

Lub tylko:

<a href="" th:class="${isAdmin} ? 'newclass' : 
  'baseclass'"> 
 </a>
N Djel Okoye
źródło
0

Jeśli chcesz odpowiednio dodać lub usunąć klasę, jeśli adres URL zawiera określone parametry lub nie. Oto, co możesz zrobić

<a th:href="@{/admin/home}"  th:class="${#httpServletRequest.requestURI.contains('home')} ? 'nav-link active' : 'nav-link'"  >

Jeśli adres URL zawiera słowo „home”, zostanie dodana aktywna klasa i na odwrót.

Shubh
źródło
0

Na wypadek, gdyby ktoś korzystał z Bootstrap, udało mi się dodać więcej niż jedną klasę:

<a href="" class="baseclass" th:classappend="${isAdmin} ?: 'text-danger font-italic' "></a>
Charlie
źródło