以下百里叶标记我错过了什么:
<tr th:fragment="row" th:with="defaultAttrs='placeholder=\'' + ${placeholder} + '\''">
<td>
<input th:attr="${attrs ?: defaultAttrs}" />
</td>
...
</tr>
来自
<th:block th:include="row::row(attrs='value=\'*{prodName}\', minLength=\'.{2, 16}\', required, title=\'starts with an alphabet 2 and 8\' placeholder=\'Product name\'')" />
产生此错误:
Could not parse as assignation sequence: "${attrs ?: defaultAttrs}"
在不相关的说明中,必须对异常消息进行双重处理,以便有意识地使用单词assignation而不是赋值
答案 0 :(得分:2)
您正尝试将文字字符串传递给th:attr
。 Thymeleaf期待表达,但不是字符串。下一个例子不起作用,但这是你要做的:
<input th:attr="${'placeholder=\'defaultPlaceholder\''}" />
我建议你下一步:
<tr th:fragment="row" th:with="defaultPlaceholder='placeholder', defaultMaxlength=10">
<td>
<input th:attr="placeholder=${placeholder?:defaultPlaceholder},
maxlength=${maxlength?:defaultMaxlength}" />
</td>
...
</tr>
它看起来更长,但可以让您更好地控制管理属性。
已更新:如果您希望在一个字符串变量中传递所有属性,则可以使用Thymeleaf的preprocessing。例如,下一个代码就是如何在页面中使用片段:
<div th:include="fragment :: row(attrs='value=\'*{prodName}\', minLength=\'.{2, 16}\',
required=true, title=\'starts with an alphabet 2 and 8\', placeholder=\'Product name\'')">
那么你的片段会是这样的:
<div th:fragment="row">
<div th:with="defaults='placeholder=\'placeholder\', maxlength=10'" th:remove="tag">
<tr>
<td>
<input th:if="${attrs!=null}" th:attr="__${attrs}__"/>
<input th:if="${attrs==null}" th:attr="__${defaults}__"/>
</td>
...
</tr>
</div>
</div>
说明:
<tr>
作为主标记。而是将<tr>
包裹到<div>
。th:with
中声明的所有变量。因此,如果您想将任何参数传递给片段,请不要在片段的主标签中声明th:with
。做它片段的主体。th:remove
attribute即可。此属性允许您删除片段的一部分。在此示例中,我们使用第二个<div>
来声明th:with
,我们在结果页中不需要此<div>
。 attr
th:include
参数中有错误。因为属性是名称和值的对,所以不能仅指定required
。你必须写:required=true
。另一个错误:您错过了title
和placeholder
之间的逗号。正确的字符串应该是下一个:
<th:block th:include="row::row(attrs='value=\'*{prodName}\', minLength=\'.{2, 16}\',
required=true, title=\'starts with an alphabet 2 and 8\', placeholder=\'Product name\'')" />