我想定义一个标签 separator
标记,在 list
tag中,可以在项目之间添加分离器。
示例代码是:
List<String> users = new ArrayList<String>();
users.add("Jeff");
users.add("Mike");
#{list users, as: 'user'}
#{separator ' + ' /}
<span>${user}</span>
#{/list}
如果我不使用separator
标签,则代码为:
#{list users, as: 'user'}
${user_isFirst ? '' : ' + '}
<span>${user}</span>
#{/list}
生成的HTML代码将是:
<span>Jeff</span> + <span>Mike</span>
我尝试定义一个fastTag
:
public static void _separator(Map<?, ?> args, Closure body, PrintWriter out, GroovyTemplate.ExecutableTemplate template, int fromLine) {
Object value = args.get("arg");
// TODO how to get the value of `as` defined in parent `list` tag?
out.print(value);
}
但问题是我无法获得list
标签中定义的as
的值(在这种情况下为user
)。
您可以在groovy中创建一个自定义列表标签
#{list items:_arg, as:'tmp'}
%{
attrs = [:]
attrs.put(_as, tmp)
}%
#{ifnot tmp_isFirst}${_sep}#{/ifnot}
#{doBody vars:attrs /}
#{/list}
并像这样使用
#{myList users, as:'user', sep:','}
${user}
#{/myList}
您应该追踪到快速签名实现。我认为您会看到ARGS映射内部范围中的所有变量。这是来自内存的 - 因此,对不起,如果没有。
也就
#{list users, as: 'user', separator: '+' }
并处理其中的逻辑。从设计的角度来看,它似乎也有点干净 - 如果是分隔符,那么如何将其放在代码中的任何位置(为什么不将其放入两次!)。
最终选择是查看Groovy或Java收集操作员。http://groovy.codehaus.org/groovy-jdk/java/java/util/collection.html