【问题标题】:Thymeleaf inline javascript spring bean check for null with textual template modesThymeleaf 内联 javascript spring bean 使用文本模板模式检查 null
【发布时间】: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 的组合.所以我仍然很困惑为什么它对我不起作用。

标签: javascript spring spring-boot thymeleaf


【解决方案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 中处理空值。
猜你喜欢
  • 2019-12-31
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 2020-08-27
  • 2018-02-18
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多