我正在尝试编写一些需要使用模型属性的Javascript代码。以下是我定义脚本标记的方法:
<script type="text/javascript" th:inline="javascript">
/*<![CDATA[*/
//need some loops
/*]]>*/
</script>
我需要做的是,对脚本中的模型属性使用each
次迭代。到目前为止,我无法使用th:each
执行此操作。任何帮助表示赞赏。
答案 0 :(得分:18)
我猜你需要用双括号包装你的模型attrubite,如:[[${modelAttribute}]]
。 Thymeleaf文档的脚本内联部分可以帮助一点:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#script-inlining-javascript-and-dart
<script type="text/javascript" th:inline="javascript">
/*<![CDATA[*/
var theList = [[${modelAttribute}]]
for (i = 0; i < theList.length; i++) {
doSomething(theList[i]);
}
/*]]>*/
</script>
答案 1 :(得分:9)
你也可以这样做,这是我认为最紧凑的:
在@Controller
:
model.addAttribute("items", new String[] { "item1", "item2", "item3" });
在你的模板中:
<script type="text/javascript" th:inline="javascript">
var items = [];
/*[# th:each="n : ${items}"]*/
items.push("[(${n})]");
/*[/]*/
</script>
其他有用的东西在这里解释:[MAJOR FEAT] New syntax for textual template modes #395
答案 2 :(得分:3)
Thymeleaf 3 - &gt;见yglodt回答
如果你坚持使用 Thymeleaf 2 并且你的模型属性很复杂(就像Maxime Laval的情况一样),我最终会循环遍历一个脚本:
<script th:inline="javascript">
var dataLayer = [];
</script>
<script th:each="item:${items}" th:inline="javascript">
dataLayer.push({'attr1':item.attr1, 'attr2':item.attr2, 'attr3':item.attr3});
</script>
<script th:inline="javascript">
console.log(dataLayer); // do whatever you want with dataLayer...
</script>
不是很好,但我找不到更好的Google分析。
答案 3 :(得分:1)
通过添加/*[[${name}]]*/
<script type="text/javascript" th:inline="javascript">
/*<![CDATA[*/
var theList = /*[[${modelAttribute}]]*/
for (i = 0; i < theList.length; i++) {
doSomething(theList[i]);
}
/*]]>*/
</script>
答案 4 :(得分:1)
thymeleaf将对象转换为script标记内的javascript变量,因此可以使用javascript代码访问属性。无需担心:
<script type="text/javascript" th:inline="javascript">
/*<![CDATA[*/
//the list converts as a javascript object
var availableTypes = /*[[${dataList}]]*/;
console.log(availableTypes);
/*]]>*/
</script>
答案 5 :(得分:0)
如果你被Thymeleaf 2困住,另一种方法是在你的脚本标签中滥用“th:block” - 元素
<script type="text/javascript">
var arrayOfIds= [
<th:block th:each="element: ${list}" th:inline="text">[[${element.Id}]],</th:block>
-1
];
arrayOfIds.pop(); // Remove the superflous last Element
</script>