Передача аргументов фрагменту тимилиста дает ошибку - PullRequest
0 голосов
/ 14 февраля 2020

С 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 - как всегда с тимелистом + пружиной> <

...