【发布时间】:2011-07-27 15:31:02
【问题描述】:
【问题讨论】:
标签: freemarker
【问题讨论】:
标签: freemarker
您必须通过连接x 和仅包含新元素的序列来创建一个新序列:
<#assign x = x + [ "green" ] />
【讨论】:
SequenceModel 类具有 add 方法,但在调用它们的语法中不存在任何内容。所以我的解决方案是做到这一点的唯一方法(当然没有编写 Java 代码并将其添加到模型中)。
SimpleSequence 只是序列实现之一,SimpleSequence.add 仅用于初始化 Java 中的序列。
x+["green"] 在<#list> for 3000 次 带来了性能问题,但是 ["green"] + x 解决了这个问题! 关于左手和右手。顺便说一句 @LaurentPireyn 的解决方案是另一种好方法。
FreeMarker 基本上是一种只写一次的语言。它非常努力地使操作数据变得不可能,包括修改数组或映射等。
但是,您可以通过连接和重新分配来解决此问题:
<#assign my_array = [] />
<#list 1..10 as i>
<#assign my_array = my_array + ["value " + i] />
</#list>
这将产生一个包含“值 1”到“值 10”的数组。如果这看起来不优雅,那是因为它是这样设计的。从 FreeMarker 的意识形态角度来看,一旦您开始构建数组等,您就已经超越了模板语言应该做的事情,而进入了模型、控制器、帮助类等在 Java 代码中应该做的事情。您越偏离这个观点,在 FreeMarker 中工作就会变得非常令人沮丧。
来自http://freemarker.sourceforge.net/docs/app_faq.html#faq_modify_seq_and_map:
FreeMarkes 模板语言不支持修改序列/哈希。它用于显示已经计算的东西,而不是用于计算数据。保持模板简单。但不要放弃,您会在下面看到一些建议和技巧。
【讨论】:
Laurent's answer 是正确的并且完全可以接受。但您也可以使用速记添加值:
<#assign x += ["green"]>
现在序列将如下所示:
Sequence (5)
0 = "red" (String)
1 = 16 (BigDecimal)
2 = "blue" (String)
3 = "cyan" (String)
4 = "green" (String)
【讨论】: