在 Thymeleaf 中使用复杂的 th:attr 字段

Using complex th:attr fields with Thymeleaf

我有一个带有相当复杂 data- 属性的 Thymeleaf 模板,如下所示:

<div data-dojo-props="required: true, placeholder:'Foo bar baz', more: stuff" ...>

我想让 Thymeleaf 提供占位符,如下所示:

<div th:data-dojo-props="placeholder:'#{foo.bar.baz}'" ...>

当然不行。我应该像这样使用 th:attr

<div th:attr="data-dojo-props=placeholder:'#{foo.bar.baz}'" ...>

这也行不通。只要在 th:attr 中添加 :',模板就会中断。我也试过逃避他们,例如\:\',还尝试使用 HTML 实体,例如&38;,但也没有用。

所以我尝试了 th:prependattrth:appendattr:

<div th:prependattr="data-dojo-props=placeholder:'"
     th:attr="data-dojo-props=#{foo.bar.baz}"
     th:appendattr="data-dojo-props='"
...>

但它们也无法处理 :',也无法转义它们:

<div th:prependattr="data-dojo-props=placeholder&58;&39;"
     th:attr="data-dojo-props=#{foo.bar.baz}"
     th:appendattr="data-dojo-props=&39;"
...>

有什么方法可以使我缺少的这项工作有效?

您可以在 Thymeleaf 消息中使用参数 属性 例如:

Messages.properties:

dojo.props=required: {0}, placeholder: {1}, more: {...}
dojo.props.required=true
dojo.props.placeholder=Foo bar baz

HTML 消息属性:

<div th:attr="data-dojo-props=#{dojo.props(#{dojo.props.required}, #{dojo.props.placeholder})}"></div>

或者,如果您想从对象中获取值:

<div th:attr="data-dojo-props=#{dojo.props(${dojo.props.required}, ${dojo.props.placeholder})}"></div>

甚至选择器也能工作:

<div th:attr="data-dojo-props=#{dojo.props(*{dojo.props.required}, *{dojo.props.placeholder})}"></div>