web-dev-qa-db-fra.com

Attribut conditionnel utilisant thymeleaf

Je sais comment créer un attribut conditionnel dans une balise sur jstl:

<body <c:if test="${userCreated}"> onload="somejavascriptfunction()"</c:if> >

Mais comment puis-je le faire en utilisant thymeleaf?

IndexController

@RequestMapping("/register")
public String register(UserEntity user, @RequestParam String repeatedPassword, RedirectAttributes redirectAttributes) {
    user.setAdmin(false);
    userFacade.create(user);
    redirectAttributes.addFlashAttribute(Constants.USER_CREATED, true);
    logger.info("Usuario criado");
    return "redirect:/login";
}

Jusqu'ici la seule solution que j'ai trouvée était de le faire comme ça

<script type="text/javascript" th:if="${userCreated}">
  $(document).ready(function() {
     somejavascriptfunction()
  });
</script>

Mais cela ne semble pas être la meilleure façon de le faire. Alors, comment puis-je faire une déclaration if pour un attribut sur thymeleaf?

13
Davi Alves

C'est vraiment un peu contre-intuitif, si vous envisagez d'ajouter une classe conditionnelle, vous utilisez le format suivant:

<div th:classappend="${userSlug != null}?has-slug">

Afin d'ajouter un attribut conditionnel, vous placez la condition sur la valeur de l'attribut, comme suit:

<div th:attrappend="data-path=${userSlug != null}?@{/myaccount/__${userSlug}__}">

Si userSlug a la valeur null, l'instruction précédente sera évaluée comme suit:

<div>

Si userSlug est pas null, l'instruction est évaluée à:

<div data-path="/myaccount/my-slug">
26
yorgo

Avez-vous essayé de créer l'attribut onload en utilisant le processeur th: attr ? Je sais que plusieurs processeurs ne rendront pas l'attribut si le résultat est null . Je ne sais pas si cela s'applique au processeur d'attr

<body th:attr="onload=${doOnload ? 'somejs()' : null}">
</body>

Je n'ai pas de code de test disponible ici, mais cela pourrait fonctionner. Vous pouvez également retourner un attribut onload vide.

Sinon, je ne vois pas de problème avec votre deuxième approche utilisant une balise de script conditionnelle. Je le fais assez souvent dans mes composants.

6
Martin Frey

la réponse de Yorgos devrait être la réponse acceptée. J'ai fait la même chose avec disabled

<div th:each="f, t : ${user1.folders}">
    <input th:attrappend="disabled=${user2.folders[__${t.index}__].closed?'disabled'}" />
</div>

PS: Je n'ai pas assez de réputation pour écrire un commentaire à la place.

2
thug-gamer

La syntaxe correcte est la suivante:

th:attr="attributeName=${condition}? 'conditionIsTrue' : 'conditionIsFalse'"
1
Tamb