thymeleaf multiple sélectionné sur edit
Je suis totalement changer cette question, dans le cadre de, il a été répondu ici avec l'aide précieuse de Avnish!
Tom m'a envoyé le bon sens, donc je vous remercie de Tom!
Mon problème est que je ne sais pas comment dire Thymeleaf pour présélectionner des éléments d'objet lors de l'édition.
Permettez-moi de vous montrer:
Cette solution fonctionne:
<select class="form-control" id="parts" name="parts" multiple="multiple">
<option th:each="part : ${partsAtribute}"
th:selected="${servisAttribute.parts.contains(part)}"
th:value="${part.id}"
th:text="${part.name}">Part name</option>
</select>
J'ai essayé ceci:
<select class="form-control" th:field="*{parts}" multiple="multiple">
<option th:each="part : ${partsAtribute}"
th:field="*{parts}"
th:value="${part.id}"
th:text="${part.name}">Part name</option>
</select>
n'a pas de travail. J'ai aussi essayé ceci:
<select class="form-control" th:field="*{{parts}}" multiple="multiple">
<option th:each="part : ${partsAtribute}"
th:field="*{parts}"
th:value="${part.id}"
th:text="${part.name}">Part name</option>
</select>
ne fonctionne pas non plus. J'ai essayé de l'enlever th:field="*{parts}"
de la balise d'option, le même résultat..
Si je change th:value
à ${part}
il fonctionne, mais il n'est pas de renvoyer la chaîne de l'ids, comme [2,4,5,6,...], mais Part
les instances de [Partie@43b45j, Partie@we43y7,...]...
Mise à JOUR: je viens de remarquer que cela fonctionne si une partie seulement est sélectionné:
<select class="form-control" th:field="*{parts}" multiple="multiple">
<option th:each="part : ${partsAtribute}"
th:field="*{parts}"
th:value="${part.id}"
th:text="${part.name}">Part name</option>
</select>
Si plusieurs éléments sont sélectionnés, il ne fonctionne pas...
source d'informationauteur Blejzer
Vous devez vous connecter pour publier un commentaire.
Après la discussion sur le Thymeleaf forum, j'ai mis en place un travail complet exemple à
https://github.com/jmiguelsamper/thymeleafexamples-selectmultiple
Je pense que le seul problème avec votre code final est que vous avez à utiliser la double support de la syntaxe pour appeler le conversionService:
Il est également important de mettre en œuvre la bonne equals() et hashcode() dans votre classe Partie pour assurer une bonne comparaison.
J'espère que mon exemple aide à d'autres utilisateurs avec des problèmes similaires à l'avenir.
Vous n'avez pas besoin
th:selected
lors de l'utilisation deth:field
normalement. Thymeleaf va automatiquement vérifier les valeurs de chaque<option>
dans le<select>
même si elle estmultiple
Le problème réside dans la valeur. Vous êtes une itération sur
parts
mais la valeur de chaque option estpart.id
. Ainsi, vous comparez les instances de la partie à l'id de la partie (aussi loin que je peux voir).Cependant, Thymeleaf prend également en compte les instances de
PropertyEditor
(il réutiliseorg.springframework.web.servlet.tags.form.SelectedValueComparator
).Ce sera utilisée lorsque l'on compare les objets à la valeur des options. Il vous permet de convertir les objets à leur valeur de texte (id) et de la comparer à la valeur.
Propriété De L'Éditeur
Définir un
PropertyEditor
pour les pièces. Le PropertyEditor sera appelée lorsque l'on compare les valeurs, et lors de la liaison des pièces retour à la forme.Aussi jeter un oeil à
ConvertingPropertyEditorAdapter
.Converter
instances qui sont inscrits dans laconversionService
sont plus privilégiées au Printemps de nos jours.Cela fonctionne pour moi:
Un vétérinaire a de nombreuses spécialités.
Contrôleur:
Vue (à l'aide de th:sélectionné):
Vue (à l'aide de th:champ):
Et je dois définir
Specialty findOne(@Param("id") Integer id) throws DataAccessException;
dans le SpecialtyRepository, sinon, l'exception suivante est générée : "java.lang.IllegalStateException: Référentiel n'est pas un trouver-un-méthode déclarée!"Voici comment je l'ai fait:
Mon DTO contient:
Select Simple exemple