Thymeleaf嵌套foreach中如何重置计数器?
在Thymeleaf嵌套循环中重置外层迭代计数器的实现方法
首先直接给你结论:你没办法手动修改Thymeleaf自带的迭代状态变量(比如你代码里的iter)。这类变量是Thymeleaf在循环过程中自动维护的局部上下文变量,完全由框架控制,不允许我们手动修改它的数值。
不过如果你的需求是需要一个可以手动控制的计数器(而非依赖Thymeleaf自带的迭代索引),那我们可以通过自定义变量的方式实现,毕竟Thymeleaf提供了灵活的变量处理能力。
具体实现方案
因为Thymeleaf中的简单变量是不可变的,所以我们需要借助一个引用类型的容器(比如HashMap)来存储计数器值,这样就能修改它的内容了。步骤如下:
- 先初始化一个用来存计数器的
HashMap,设置初始值; - 在循环中使用这个自定义计数器;
- 在外层循环结束时,手动将计数器重置为0或你需要的指定值。
代码示例
<!-- 初始化一个HashMap来存放自定义计数器,初始值设为0 --> <th:block th:with="customIter=${T(java.util.HashMap).new()}"> <th:block th:with="${customIter.put('index', 0)}" /> <!-- 外层角色循环 --> <div th:each="role : ${roles}"> <!-- 这里可以使用自定义计数器的值 --> <div th:text="|当前自定义索引: ${customIter.get('index')}, 角色名称: ${role.name}|"></div> <!-- 内层权限循环 --> <div th:each="authority : ${authorities}" th:text="${authority.name}"></div> <!-- 外层循环结束后,重置自定义计数器为0 --> <th:block th:with="${customIter.put('index', 0)}" /> </div> </th:block>
额外说明
如果你只是误解了Thymeleaf自带迭代变量的作用:外层的iter变量是用来标识当前元素在整个roles集合中的位置的,它会从0开始依次递增,直到遍历完所有元素,这个逻辑是框架固定的,没办法让它在每个外层循环后重置。如果你的需求就是要每个角色对应的“本地索引”都是0,那上面的自定义计数器方案完全可以满足你。
内容的提问来源于stack exchange,提问作者Sml004
相关产品推荐
相关产品推荐

