Thymeleaf 内联 javascript spring bean 使用文本模板模式检查 null

Posted

技术标签:

【中文标题】Thymeleaf 内联 javascript spring bean 使用文本模板模式检查 null【英文标题】:Thymeleaf inline javascript spring bean check for null with textual template modes 【发布时间】:2022-01-02 20:32:48 【问题描述】:

我无法理解 Thymeleaf 的 Textual template modes 功能的语法。我试图访问bean(工作正常)并调用getter,从那里我得到另一个对象。这个对象可以是空的,我需要在访问我需要的字符串之前检查它。

如何使用 Thymeleaf 中的 [# th:if 表达式在一行中做到这一点?

<script th:inline="javascript">
        //This does not work (i have tried multiple things)
        var string = /*[# th:if="$@bean.getObject()"][[$@bean.getObject().getString()]][/]*/ null;
</script>

【问题讨论】:

快速测试(与您的示例不完全相同)表明我无法将文本模板语法与 JavaScript natural templating 功能结合起来,您将表达式包含在注释 var myString = /* ... */ null; 中。如果我删除自然模板块,我的表达式会按预期工作:var myString = [# th:if="$foo == 'bar'"][[$foo]][/];。否则,它被解释为注释。以防万一。 也许我误解了这个问题 - 我以为您明确想要使用 textual syntax 方法,而不是更典型的 JavaScript inlining 方法。否则,我认为@metroids 的答案是正确的方法。 我在没有/* ... */ 的情况下测试了我的逻辑并且它有效。所以你是对的。但是,如果我删除了这些评论表达式,IntelliJ 会抱怨,并且在浏览器中独立打开 .html 文件时不会呈现它。而且我不明白为什么在这种情况下我必须删除它们.. "为什么我必须删除它们" - 您正在组合两种不兼容的语法。使用 cmets 的 JavaScript 内联意味着 Thymeleaf 期望在 [[]] 中找到标准的 $... 表达式语法 - 而您尝试使用文本 [#...][/] 语法。您可以在我早期的 cmets 核心 Thymeleaf 的链接中找到教程和示例。对于 Spring,您可以在此处找到 SpEL 文档:Spring Expression Language (SpEL)。 SpEL 是您可以找到“安全导航”运算符的地方。 阅读此功能版本,它应该可以像我尝试的那样工作:github.com/thymeleaf/thymeleaf/issues/395 如果您向下滚动到“将 cmets 应用于任何元素”,他们会在 JAVASCRIPT 中解释输出表达式和 cmets 的组合.所以我仍然很困惑为什么它对我不起作用。 【参考方案1】:

有很多方法可以做到这一点,为此我推荐safe navigation operator:

<script th:inline="javascript">
  var string = /*[[$@bean.object?.string]]*/ null;
</script>

你也可以使用三元表达式:

<script th:inline="javascript">
  var string = /*[[$@bean.object != null ? @bean.object.string : null]]*/ null;
</script>

【讨论】:

这行得通,谢谢。但是更复杂的逻辑会是什么样子呢?例如,如果我还需要检查字符串是否为空?这种语法的限制是什么?我在网上找不到任何好的教程或示例.. IMO,如果你想变得更复杂,你应该序列化整个对象 var bean = /*[[$@bean]]*/ null; 并在 JavaScript 中处理空值。

以上是关于Thymeleaf 内联 javascript spring bean 使用文本模板模式检查 null的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf 内联 javascript spring bean 使用文本模板模式检查 null

thymeleaf 学习笔记4

thymeleaf CSS内联表达式前端css里面怎么获取后台模板值

spring boot 与 thymeleaf : 设置属性条件遍历局部变量优先级内联语法

Thymeleaf(第九十一二章)本地变量#属性优先级#注释和块#内联

如何将整数附加到 url 脚本内联百里香?