如何将新标签注入TagLib?

时间:2010-10-29 11:03:48

标签: grails groovy metaprogramming

让我们假设我的conf/InjectionConfig.groovy文件中有以下配置:

x {
    a = { attrs, body -> out << "hello" }
    b = { attrs, body ->  out << "goodbye" }
}

我有一个简单的taglib,例如

class XTagLib {
    static namespace = "x"
}

我想要做的是,当我向任意视图输入<x:a />时,它会打印hello。我已经尝试将这些注入到taglib的元类中作为属性和方法但似乎都不起作用。举个例子,这里基本上就是我现在在服务中所做的事情:

public void afterPropertiesSet() throws Exception {
    GroovyClassLoader classLoader = new GroovyClassLoader(getClass().classLoader)
    def slurper = new ConfigSlurper(GrailsUtil.environment)
    ConfigObject xConfig
    try {
        xConfig = slurper.parse(classLoader.loadClass('InjectionConfig'))
    }
    catch (e) {
        e.printStackTrace()
    }
    xConfig.x.each({
        if ( !XTagLib.metaClass.hasMetaProperty(it.key) ) {
            XTagLib.metaClass.registerBeanProperty(it.key, { args ->
                def attrs = args[0], body = args[1]
                it.value.call(attrs, body)
            }
        }
    })
}

我只是做错了或者目前这是否可能?

2 个答案:

答案 0 :(得分:2)

好吧,这个

    def shell = new GroovyShell() // or get a GroovyClassLoader
    Class yTagLibClass = shell.evaluate("class YTagLib { static namespace = 'x' }; return YTagLib")

    yTagLibClass.metaClass.a = { attrs, body -> delegate.out << 'blabla' }
    grailsApplication.addArtefact(TagLibArtefactHandler.TYPE, yTagLibClass)

&LT; X:A /&GT;几乎为我工作 - 注册了一个标签,除了它没有输出任何东西。您仍然需要使封面解析out对抗Grails的taglib的out属性。

我没有看到很好的方法,因为无法访问实例变量,out是一个实例变量。请参阅Grails源代码,JspInvokeGrailsTagLibTag.doStartTagInternal() - 您可能会找到一种方法。

编辑:我添加了delegate.前缀,该前缀应该解析目标对象的out属性。现在我相信我值得接受:)。

答案 1 :(得分:1)

  

我想要做的是当我输入时    对于我的任何观点,它会   打印你好

我认为还有另一种方法可以做你想要的事情:结合模板&amp;标签库。首先,创建一个模板,然后将其添加到TagLib中(没有复杂的配置)。

在我看来,它比你的方法更简单。

请看一下本教程: http://jan-so.blogspot.com/2008/02/example-of-template-and-taglib-with.html