С Spring и Thymeleaf 3 я застрял.
У меня есть мульти-флажок html код чанка, который я хочу использовать повторно: поэтому я хочу, чтобы он был внутри фрагмента.
Код без фрагментов работает отлично:
<div>
<h5 th:text="#{sg.multi-checkbox}"></h5>
<div class="field-box--wrapper">
<script type="text/javascript"
charset="utf8"
th:src="@{/static/js/components/multichoice.js}"></script>
<div class="field-box"
th:each="attr, stat: ${allAttributs}"
th:classappend="${!attr.nonModifiable && !dummy.isEdit()} ? 'field-hide'">
<div th:if="${dummy.isEdit() || #arrays.contains(dummy.attributsCoches, attr.id)}">
<input type="checkbox"
th:readonly="${attr.nonModifiable}"
th:field="${dummy.attributsCoches}"
th:value="${attr.id}"
/>
<label th:for="${'attributsCoches' + __${stat.index + 1}__}"
th:text="${attr.nom}">label</label>
<i class="fa fa-plus"></i>
<i class="fa fa-check"></i>
</div>
</div>
</div>
Теперь я помещаю код во фрагмент тимьяна и называю его th:replace
. Поскольку этот фрагмент должен быть повторно использован в любом месте кода, я не могу сохранить имена переменных, которые я использовал для разработки тестов. Это должно быть хорошо, поскольку в документации объясняется, как это сделать. «Чтобы создать более функциональный механизм для фрагментов шаблона, фрагменты, определенные с помощью th: фрагмента, могут указывать набор параметров:» * https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#template -layout
Итак, я сделал:
Фрагмент
<div th:fragment="multichoix(mcTitle, mcAllChoices, mcIsEdit, mcCheckedChoices, mcCheckedChoicesName )">
<h5 th:text="${mcTitle}"></h5>
<div class="field-box--wrapper">
<script type="text/javascript"
charset="utf8"
th:src="@{/static/js/components/multichoice.js}"></script>
<div class="field-box"
th:each="attr, stat: ${mcAllChoices}"
th:classappend="${!attr.nonModifiable && !mcIsEdit} ? 'field-hide'">
<div th:if="${mcIsEdit || #arrays.contains(mcCheckedChoices, attr.id)}">
<input type="checkbox"
th:readonly="${attr.nonModifiable}"
th:field="${mcCheckedChoices}"
th:value="${attr.id}"
/>
<label th:for="${mcCheckedChoicesName + __${stat.index + 1}__}"
th:text="${attr.nom}">label</label>
<i class="fa fa-plus"></i>
<i class="fa fa-check"></i>
</div>
</div>
</div>
И я называю фрагмент (с той же страницы, с той же моделью) с:
<!-- Fragmented multicheckbox -->
<div th:replace="styling/html-component/atomic/multichoix :: multichoix(mcTitle='a',
mcAllChoices=${allAttributs},
mcIsEdit=${dummy.isEdit()},
mcCheckedChoices=${dummy.attributsCoches},
mcCheckedChoicesName='attributsCoches')">
multichoix fragment
</div>
Я получил
java .lang.IllegalStateException: ни BindingResult, ни простой целевой объект для имени компонента «mcCheckedChoices» не доступны в качестве атрибута запроса
Что мне не хватает? Почему
dummy.attributsCoches
не обрабатывается правильно?
Если я добавлю dummy.attributsCoches
в свой фрагмент (так что никакой промежуточной переменной), это, очевидно, работает.
dummy.attributsCoches - это личный список с Getter и Setter.
Редактировать: не работает, если я передаю аргумент без их имен:
<!-- Fragmented multicheckbox -->
<div th:replace="styling/html-component/atomic/multichoix :: multichoix(
'a',
${allAttributs},
${dummy.isEdit()},
${dummy.attributsCoches},
'attributsCoches')">
multichoix fragment
</div>
Редактировать: поэтому проблема с th:field
- как всегда с тимелистом + пружиной> <