讓我們假設我有以下的配置,我conf/InjectionConfig.groovy
文件:如何將新標籤注入TagLib?
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)
}
}
})
}
我只是做錯了或者是這甚至可能現在?
恐怕ConfigSlurper會在解析DSL時執行InjectionConfig中的代碼,並且只會產生樹狀值結構。 你想要的是從代碼中加載閉包,但是你得到了它們的執行結果,對嗎?無論如何,在調試器下記錄或檢查'it.value'是個好主意。 – 2010-11-26 11:41:24
@Victor:實際上不是,我正在從slurper實際關閉; slurper的語法是'{b {c = d}}',但是使'b'成爲閉包(*,即'{b = {c = d}} *)會導致可運行閉包。 – Esko 2010-11-26 11:48:38
看起來像Grails在聲明後處理taglib類。現在我看到您需要執行grailsApplication.addArtefact(TagLibArtefactHandler.TYPE,),但還是必須提供worknig示例。 –
2010-11-26 14:18:15