【问题标题】:Creating empty data-attributes in Thymeleaf在 Thymeleaf 中创建空数据属性
【发布时间】:2017-08-13 15:11:45
【问题描述】:

我正在尝试使用自定义数据属性在 Thymeleaf 3.0.3(Spring 4.3.7)中创建一个元素:

<input th:attr="data-customAttr=${item.getMyAttr()}" />

如果 item.getMyAttr() 的结果是 'someVal',那么渲染出来的 HTML 就是:

<input data-customAttr='someVal' />

但是,如果 item.getMyAttr() 的结果是空字符串,则自定义属性会被 Thymeleaf 完全丢弃。呈现的 HTML 如下所示:

<input />

我需要知道自定义属性是否已定义且为空或缺失且未定义。根据这个讨论:Are empty HTML5 data attributes valid? ,空的数据属性应该是完全有效的。

经过一番挖掘,我遇到了以下测试用例,它似乎表明 Thymeleaf 无法渲染空数据属性,这就是它在渲染时间之前将它们丢弃的原因。以下 Thymeleaf sn-p 渲染得很好:

<input th:attr="__${'data-customAttr=' + 'someVal'}__" />

虽然这两个都抛出错误:

<!-- Throws: 'org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as assignation sequence' -->
<input th:attr="__${'data-customAttr=' + ''}__" />
<input th:attr="__${'data-customAttr'}__" />

这是 Thymeleaf 中的错误吗?任何帮助将不胜感激。我也很乐意提供任何其他相关信息。

编辑:这是我在相当大的应用程序中大量使用的功能。虽然我知道有几种解决方法,但它们都增加了我为了完成一个非常简单的任务而必须编写/维护的代码量。我希望有一个长期的解决方案,即使该解决方案是“这是一个错误,请报告它”。

【问题讨论】:

    标签: html thymeleaf custom-data-attribute


    【解决方案1】:

    __ 语法并没有什么特别之处……它只是让它运行了两次求值程序。它不起作用的原因是因为在每种情况下,它都会解析为无效的 thymeleaf 表达式。

    例如:

    <input th:attr="__${'data-customAttr=' + ''}__" />
    <!-- evaluates to -->
    <input th:attr="data-customAttr=" />
    <!-- which is an invalid expression -->
    

    相同
    <input th:attr="__${'data-customAttr'}__" />
    <!-- evaluates to -->
    <input th:attr="data-customAttr" />
    <!-- which is again, an invalid expression -->
    

    似乎 thymeleaf 不会添加空属性。所以我认为你要做的最好的事情是这样的:

    <input th:attr="data-customAttr-exists=${item.getMyAttr() != null}, data-customAttr=${item.getMyAttr()}" />
    

    您必须检查第一个属性以了解它是否存在,并检查第二个属性的值。这应该可以让您了解所有情况。

    【讨论】:

    • 谢谢!这是我考虑过的众多解决方法之一。不幸的是,我正在开发一个相当大的应用程序,并且只能容忍这么多比他们解决的问题更复杂的解决方案。我已经编辑了这个问题,以便更具体地说明我在寻找什么。你知道这是一个错误还是故意的?如果是错误,我很乐意报告。
    • 我不认为这是一个错误......很可能是一个设计选择。
    • 明白。再次感谢您的咨询!看来我不能(公开)以我的低名声给你一分。
    猜你喜欢
    • 2020-06-27
    • 2017-09-09
    • 2016-08-19
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多