如何在不修改 play 源代码的情况下在 play-1.x 中定义"分隔符"标签



我想定义一个标签 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

最新更新