使用Thymeleaf,我想通过关闭以前的<ul>
并创建一个新的子列表来呈现DB查询的结果,每当"菜单"或"子菜单"值相对于以前的迭代发生变化时。例如,我想转换以下查询结果…
----------------------------------
| Menu | SubMenu | Title |
|--------------------------------|
| MenuName1 | SubMenu1 | Title1 |
| MenuName1 | SubMenu1 | Title2 |
| MenuName1 | SubMenu2 | Title3 |
| MenuName2 | SubMenu3 | Title4 |
| MenuName3 | SubMenu4 | Title5 |
----------------------------------
将…放入无序列表中,如下所示(用于菜单):
<ul>
<li>MenuName1
<ul>
<li>SubMenu1
<ul>
<li>Title1</li>
<li>Title2</li>
</ul>
</li>
<li>SubMenu2
<ul>
<li>Title3</li>
</ul>
</li>
</ul>
</li>
<li>MenuName2
<ul>
<li>SubMenu3
<ul>
<li>Title4</li>
</ul>
</li>
</ul>
</li>
<li>MenuName3
<ul>
<li>SubMenu4
<ul>
<li>Title5</li>
</ul>
</li>
</ul>
</li>
</ul>
我可以访问服务器和客户端代码,所以我很高兴为模板提供一个更友好的格式,如果这是一个更优雅的解决方案。
必须在服务器端将数据转换为正确的格式。
在您的示例中,您将为Menu
和Submenu
创建类:
- 你的主类有一个
LinkedHashMap<String, Menu>
,将菜单标题映射到菜单 -
Menu
有一个LinkedHashMap<String, Submenu>
,它将子菜单标题映射到子菜单 -
Submenu
有Article
s列表
然后您的Java代码遍历Article
列表,并基于Article
的menu
和submenu
属性动态创建Menu
和Submenu
实例,然后将Article
添加到正确的Submenu
。这可能是有帮助的方法Menu getOrCreateMenu(String title)
在你的主类和Submenu getOrCreateSubmenu(String title)
在你的Menu
类来处理创建一个新的(子)菜单的逻辑,如果一个给定的标题还不存在,或返回一个现有的如果一个(看看Map.computeIfAbsent
可以做到这一点非常简洁)。
然后将整个菜单列表放入一个模型并将其发送给Thymeleaf;然后呈现应该是微不足道的:
<ul>
<li th:each="menu : ${menus}" th:text="${menu.title}>
<ul>
<li th:teach="submenu : ${menu.submenus}" th:text=${submenu.title}>
<ul>
<li th:each="article : ${submenu.articles}" th:text="${article.title}" />
</ul>
</li>
</ul>
</li>
</ul>