自定义标记g.each冲突每个闭包

时间:2013-08-20 12:44:29

标签: grails

我有一个自定义标签,因为我想要包装g:每个

def myEach = { attrs, body ->
    out << "${g.each(in:attrs.in, var:attrs.var, status:attrs.status) { 'test' }}"
}

但是每个标记都会出错,因为它与每个标记都有混淆。我能做到这一点吗?最糟糕的情况是我将输出一个包含每个标签的gsp页面。

3 个答案:

答案 0 :(得分:2)

我可能遗漏了一些东西,但单引号没有帮助,例如:

def myEach = { attrs, body ->
    out << "${g.'each'(in:attrs.in, var:attrs.var, status:attrs.status) { 'test' }}"
}

这样你就会得到同样的错误......

我的解决方案是使用groovyPagesTemplateEngine bean。有了它,你可以解析一个字符串模板:

def myEach = { attrs, body ->
    attrs.content = "test"
    String template = "<g:each in='${attrs.in}'>${attrs.content}</g:each>" 
    groovyPagesTemplateEngine.createTemplate(template, 'mytemplate').make([attrs:attrs]).writeTo(out)
}

答案 1 :(得分:1)

更新如果您想调用标准代码,只需尝试调用它,例如:

  //ApplicationTagLib g

  def myEach = { attrs, body ->
    out << g.each([in:attrs.in, var:attrs.var, status:attrs.status]) {
      'test'
    }
  }

<强> OLD

如果要将字符串放入输出中,请尝试使用标准字符串,而不是GroovyString。不是"${g.each....}",而是'${g.each....}'

out << '${g.each(in:attrs.in, var:attrs.var, status:attrs.status) { \'test\' }}'

或者只是逃避$

out << "\${g.each(in:attrs.in, var:attrs.var, status:attrs.status) { 'test' }}"

答案 2 :(得分:1)

您完全可以像Grails一样注册自己的标签:

import org.apache.commons.lang.StringUtils;
import org.codehaus.groovy.grails.web.taglib.GroovySyntaxTag;
import org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException;

public class Whatever extends GroovySyntaxTag {

    public static final String TAG_NAME = "youreach";

    public void doStartTag() {
        String in = attributes.get(ATTRIBUTE_IN);
        if (StringUtils.isBlank(in)) {
            throw new GrailsTagException("Tag [" + TAG_NAME + "] missing required attribute [" + ATTRIBUTE_IN + "]", parser.getPageName(), parser.getCurrentOutputLineNumber());
        }

        doEachMethod(in);
    }

    public void doEndTag() {
        endEachMethod();
    }

    public String getName() {
        return TAG_NAME;
    }

    @Override
    public boolean isKeepPrecedingWhiteSpace() {
        return true;
    }

    @Override
    public boolean isAllowPrecedingContent() {
        return true;
    }
}

然后在Bootstrap.groovy中,将此类注册为标记。

    GrailsTagRegistry.instance.registerTag(Whatever.TAG_NAME, Whatever.class)

您可以创建自己的扩展GroovySyntaxTag的类来操作那里的任何方法。然后让这个类扩展它。