当前位置: 首页 > 知识库问答 >
问题:

Thymeleaf, Javascript内联和迭代

彭飞虎
2023-03-14

使用SpringMVC和Thymeleaf,我正在构建一个包含一些javascript的html视图。

在页面中,th: each与迭代值一起使用,为一组按钮提供唯一的超文本标记语言id。

<td th:each="optionValue,iterStat : ${someObject.optionValues}">
  <button class="btn btn-default" th:id="${'optionBtn_' + (iterStat.count - 1)}" th:text="${optionValue.toString()}" />
</td>

我的问题出现在尝试生成javascript时,该javascript将对每个按钮id使用jQuery引用。

在另一种视图解析语言中,我会使用代码

<% for(var i = 0; i < someObject.optionValues.length; i++) { %>
    $('#optionBtn_<%- i %>').on("click", function() {
        doSomething('<%= someObject.optionValues[i] %>');
    });
<% } %>

(以上可能不是100%语法正确,但我希望你明白——我试图做的是可能使用上述风格)

但是在Thymeleaf,虽然我知道我可以使用

th:inline="javascript"

为了引用单个模型项,我看不出如何使用look在脚本块中生成多个jQuery函数调用定义。

有什么想法吗?(我可能在处理这个问题时完全错了,所以我也愿意接受这方面的新想法)

共有2个答案

云和惬
2023-03-14

所以我做了一个变通办法。

因为页面中可以存在多个元素,所以我只需创建标签的外部循环,并为每个按钮创建一个。方法调用中的细节将具有与迭代中相同的索引/文本映射,以首先创建按钮,尽管文本创建有点棘手:

<script th:each="optionValue,iterStat : ${someObject.optionValues}">
   $([[${'#optionBtn_' + (iterStat.cont - 1)}]]).on("click", function() {
      buttonPressed([[${iterStat.count - 1}]], [[${estimateOption.toString()}]]);
   });
</script>

代码生成后不是最小的,但它可以工作。

施英哲
2023-03-14


显然,问题主要在于后端数据和javascript数据之间的通信。在这种情况下,javascript函数需要作为参数的数据。由于html5引入了数据属性,并在后期版本中提高了jQuery的效率,您可以将任何您想要的后端数据作为以“data-”开头的属性公开。根据html5,这是有效的。在jQuery中,您可以通过将html命名约定转换为camelCase来访问它们,就像它们是jQuery数据一样。您可以在原始的html约定中访问它们(例如my属性)。这是偏好的问题。

这样,您的html就会更干净:

<td th:each="optionValue,iterStat : ${someObject.optionValues}">
  <button class="btn btn-default" th:id="${'optionBtn_' + (iterStat.count - 1)}" th:text="${optionValue.toString()}" th:attr="data-my-func-attr=${optionValue}"/>
</td>

然后可以将事件处理程序绑定为:

$("button.btn").on("click", function() {
      buttonPressed($(this).data("my-func-attr"))
}

或类似的。

这样,您还可以保持代码的清洁,并与标记分开,这是不引人注目的JS的一个原则

 类似资料:
  • 我得到了一个使用thymeleaf模板的页面,当使用内联脚本时,我在页面加载时遇到以下错误: 组织。xml。萨克斯。SAXS异常;行号:270;栏目号:85;元素的内容必须由格式良好的字符数据或标记组成。 代码在270行 我试过替换“

  • 我有一个使用Thymeleaf的Spring启动应用程序。我正在使用字符串值设置一个模型变量,并希望在javascript中将其用作变量值。 在Java中,我执行以下操作: 我的HTML代码如下所示: JavaScript中的结果应该是: 但是我得到的是超文本标记语言: 我在超文本标记语言/JavaScript中尝试了不同的东西: 仅使用一个括号- JavaScript中没有正确的字符串。我怎样才

  • 主要内容:如何为每一行添加序号?本文章将介绍Thymeleaf标准表达式语法中的概念。我们将使用标记在模板中迭代产品列表。 编辑源代码以便将产品列表显示为表格行。已经将类的对象列表设置为具有变量名称的上下文模型(参考:中的实现)。 如果要上机实践,请参考:Thymeleaf+SpringMVC5示例项目。这里不再重复创建项目的过程,这里将只介绍如何使用标准表达式和标签。 这里创建一个Maven Web项目: thymeleaf-

  • 我有一个springboot项目,需要呈现脚本元素的一部分,如下所示。(假设函数是在其他地方定义的。) 预期产出: 其中是Spring模型属性。 是否可以使整个在一个Thymeleaf表达式中?或者,将和分配给单独的JavaScript变量,然后将它们连接起来是唯一的方法吗?我尝试了以下内容,但似乎内联的JavaScript表达式总是被引用。 实际产出: 顺便说一下,我使用的是Thymeleaf2

  • 本文向大家介绍python生成器,可迭代对象,迭代器区别和联系,包括了python生成器,可迭代对象,迭代器区别和联系的使用技巧和注意事项,需要的朋友参考一下 生成器,可迭代对象,迭代器之间究竟是什么关系? 用一幅图来概括: 1.生成器 定义生成器 方式一: 方式二: 定义成功后,我们可以利用next()访问生成器下一个元素 但一般用for循环遍历 2.迭代器 任何实现了__iter__和__ne

  • 使用Thymeleaf,我无法迭代列表 每行有多个值。 渲染时,我得到以下异常 提前谢谢。