0

我想定义一个标签separator标签,它在list标签内,可以在项目之间添加分隔符。

示例代码是:

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);
}

但问题是在这种情况下我无法获得标签中as定义的值list(即user)。

4

2 回答 2

2

您可以像这样在 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}
于 2013-01-24T07:12:30.997 回答
0

您应该跟踪您的 FastTag 实现。我想你会在 args 映射中看到范围内的所有变量。这是凭记忆 - 所以,如果不是,对不起。

也就是说,我认为如果您复制 #{list} 的 Java 代码并添加一个新参数可能会更简单,例如

#{list users, as: 'user', separator: '+' }

并处理那里的逻辑。从设计的角度来看,它似乎也更干净了——如果它是一个分隔符,你怎么能把它放在代码中你喜欢的任何地方(为什么不把它放在两次!)。

最后一个选择是查看 Groovy 或 Java 集合运算符。http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html

于 2013-01-23T23:07:11.543 回答