让我们假设我的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)
}
}
})
}
我只是做错了或者目前这是否可能?
答案 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