基本上我想要的是:
<g:fancyJoin in="${myList}" var="item" separator=", ">
<g:link controller="foo" action="bar" id="${item.id}">${item.label}</g:link>
</g:fancyJoin>
和
def mylist = [[id:1, label:"first"], [id:2, label:"second"]]
它应输出:
<a href="foo/bar/1">first</a>, <a href="foo/bar/2">second</a>
这个和现有的连接标记之间的关键区别在于我需要它在执行连接操作之前基本上在初始列表上执行收集和应用标记
答案 0 :(得分:3)
您不应该在GSP中执行此操作。使用循环和条件混乱您的视图会使代码难以维护并迫使您使用非常慢的功能测试进行测试。如果你在taglib中执行此操作,则清理视图并且测试非常简单。
答案 1 :(得分:2)
您可以定义自定义标记,例如:
def eachJoin = {attrs, body ->
def values = attrs.remove('in')
def var = attrs.remove('var')
def status = attrs.remove('status')
def delimiter = attrs.remove('delimiter')
values.eachWithIndex {entry, i ->
out << body([
(var ?: 'it') : entry,
(status ?: 'i') : i
])
if(delimiter && (i < values.size() - 1)) {
out << delimiter
}
}
}
用法:
<g:eachJoin in="${myList}" var="item" delimiter=", ">
<g:link controller="foo" action="bar" id="${item.id}">${item.label}</g:link>
</g:eachJoin>