您好我有一个我正在尝试编辑的速度模板
它目前有一个看起来像
的块#foreach( $element in $myList )
$element.field1 ($element.field2) issued by $element.field ($element.field4 )
<br><br>
#end
问题是列表中的某些元素是重复的,我需要抑制重复项。
我想要的伪代码是
for each element in list
if element is not in displayed
display element
add element to displayed
endif
endfor
有人能指出我正确的方向吗?
答案 0 :(得分:1)
这种逻辑(重复数据删除)可能是您的视图(Velocity)层中要避免的。在Model-View-Controller之后,最好让这个逻辑由控制器类管理,让Velocity模板简单地渲染它传递的数据结构。
例如,通过使用诸如java.util.Set
之类的数据结构,不会允许重复项,因此模板不需要重复数据删除。
就我个人而言,我发现Rob Harrop Pro Jakarta Velocity是一个非常好的MVC指南,尤其是第4章&#34;在MVC环境中使用Velocity&#34;。
让模型使用Set,让控制器代码填充集合,然后模板代码中的简单循环可以像现在一样使用。
通常,在视图层中实现的逻辑越少越好。它还可以使您的代码更容易测试,因此您可以验证其行为,而无需启动演示组件,应用服务器等等。
如果确实没有选择并且绝对必须在模板中写入逻辑,那么以下实现了所提供的伪代码:
#set($displayed = [])
#foreach( $element in $myList )
#if(!$displayed.contains($element))
$element.field1 ($element.field2) issued by $element.field ($element.field4 )
<br><br>
#set($ignore = $displayed.add($element))
#end
#end
请注意#set($ignore = $displayed.add($element))
的混乱 - 必须执行此操作以禁止输出java.util.List
add()
方法(布尔值)的输出。另一个不在模板代码中写这个的原因!
当然,您还需要确保在添加到列表中的类型上正确实现equals()
,以便列表操作 - contains()
和add()
正常工作。< / p>
绝对是上述MVC方法的劣等解决方案,但作为最后的选择提供。