使用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:fragment定义的片段可以指定一组参数:” 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也不是简单的Bean名称“ 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
上,就像百里香+弹簧> <
如果要预先填充某些复选框,则可能需要使用Thymeleaf fixed-value booleans。