假设我的 conf/InjectionConfig.groovy
中有以下配置文件:
x {
a = { attrs, body -> out << "hello" }
b = { attrs, body -> out << "goodbye" }
}
并且我有一个简单的标签库,例如
class XTagLib {
static namespace = "x"
}
我想要做的是当我输入
<x:a />
根据我的任何观点,它将打印 hello
.我已经尝试将这些作为属性和方法注入(inject)到 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)
}
}
})
}
我只是做错了,还是目前这可能?
最佳答案
嗯,这个
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)
out
针对 Grails 的 taglib 的 out
属性(property)。我看不出有什么好方法,因为无法访问实例变量,并且
out
是一个实例变量。请参阅 Grails 源代码 JspInvokeGrailsTagLibTag.doStartTagInternal() - 您可能会找到一种方法。编辑 : 我加了
delegate.
应该解析 out
的前缀目标对象的属性。现在我相信我应该被接受:)
关于grails - 如何将新标签注入(inject) TagLib?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4051195/