web-dev-qa-db-fra.com

Comment utiliser les conditions thymeleaf - if - elseif - else

J'ai un petit problème, je dois retourner un choix différent d'une sélection dans une td en utilisant thymeleaf, j'essaie la phrase suivante:

<td style="white-space: nowrap">
    <span th:class="${linea.estado}? 'label label-success' : 'label label-danger' : 'label label-warning'"
          th:text="${linea.estado}? #{label.glineas.estado.iniciado} : #{label.glineas.estado.finalizado} : #{label.glineas.estado.configurado}">
    </span>
</td>

Mais j'ai un problème parce que la condition me donne un gros échec car il est impossible d'analyser l'expression. Avec seulement deux conditions (iniciado et finalizado), il n'y a pas de problème, mais je dois obtenir l'étiquette correcte pour la sélection dans mon formulaire.

Quelqu'un connait la phrase correcte pour utiliser une phrase if else else avec thymeleaf?

2.0 J'essaie maintenant de résoudre ce problème avec le suivant:

<td style="white-space: nowrap">
    <span th:if="${linea.estado} == 'Iniciado'" class="label label-success" th:text="#{label.glineas.estado.iniciado}"></span>
    <span th:if="${linea.estado} == 'Finalizado'" class="label label-danger" th:text="#{label.glineas.estado.finalizado}"></span>
    <span th:if="${linea.estado} == 'Configuracion'" class="label label-warning" th:text="#{label.glineas.estado.configurado}"></span>
</td>

La solution est parfaite, maintenant tout fonctionne correctement. Merci pour tout.

10
Deckard27

Votre opérateur conditionnel contient 3 résultats. Il devrait avoir 2 comme ça.

condition ? first_expression : second_expression;

Dans votre situation Je suppose que linea.estado est une valeur boolean

<td style="white-space: nowrap">
    <span th:class="${linea.estado} ? 'label label-success' : 'label label-danger'" 
        th:text="${linea.estado}? #{label.glineas.estado.iniciado} : #{label.glineas.estado.finalizado}">
    </span>
</td>

Si vous voulez que 3 valeurs soient affichées et que le linea.estado soit une chaîne pouvant contenir 'WARN', 'DANGER', 'INFO', vous pouvez faire quelque chose comme ceci.

<span th:class="'label label-' + ((${linea.estado} == 'SUCCESS') ? 'success' : (${linea.estado} == 'DANGER') ? 'danger' : 'warning')"                   
      th:text="...">
</span>

Mais la solution plus propre sera quelque chose comme ça

<span th:if="${linea.estado} == 'SUCCESS'" class="label label-success" th:text="#{label.glineas.estado.iniciado}"></span>
<span th:if="${linea.estado} == 'DANGER'" class="label label-danger" th:text="#{label.glineas.estado.finalizado}"></span>
<span th:if="${linea.estado} == 'WARN'" class="label label-warning" th:text="#{label.glineas.estado.configurado}"></span>

Ou en utilisant Switch comme mentionné par Patrick LC

  • soyez conscient des erreurs de syntaxe, car je n'ai testé aucun code au moment de l'exécution
34
Faraj Farook

Je pense que la solution consiste à utiliser l'instruction switch de Thymeleaf documentation :

<div th:switch="${user.role}">
  <p th:case="'admin'">User is an administrator</p>
  <p th:case="#{roles.manager}">User is a manager</p>
  <p th:case="*">User is some other thing</p>
</div>

Il n'y a pas d'autre structure à utiliser dans Thymeleaf, bien que vous puissiez utiliser th: if/th: less. Vérifiez this thread dans le forum thymeleaf.

3
Leandro Carracedo

J'ai besoin d'autre si, mais toutes mes conditions ne sont pas si simples que th: switch = "$ {user.role} peut fonctionner, alors je fais ceci:

<div th:switch="true">
    <p th:case="${product.price} == '849'"> Beautiful Goat</p>
    <p th:case="false"> Magnificent Goat</p>
    <p th:case="'Whatever things I want to do with my else if'"> Goat</p>
</div>
2
Ng Sek Long

Si vous voulez avoir un seul élément, l'option est de faire plusieurs conditions ... C'est un peu déroutant mais si vous comprenez la logique, ce n'est pas grave.

Disons que vous voulez faire quelque chose comme ça:

if(user.role.admin){
 //add only class='text-success'
}else if(user.role.user){
 //add only class='text-primary'
}else{
 //add only class='text-warning'
}

La logique est if1 : 'text-success' ? if2 : 'text-primary' ? 'text-warning' Très simple. Mais la syntaxe serait la suivante:

<span th:class="( ${user.role.admin} ? 'text-success' : ( ${user.role.user} ? 'text-primary' : 'text-warning' ) )"></span>
1
Nikolay Hristov

Vous pouvez faire comme ça aussi

<p th:if="${projects != null and projects.size() gt 0}"> <a th:href="@{/hire/invite/} + ${f.id}" class="btn waves-effect">Anything</a> </p>
0
Tiago R.