2010-10-29 34 views
4

讓我們假設我有以下的配置,我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) 
      } 
     } 
    }) 
} 

我只是做錯了或者是這甚至可能現在?

+0

恐怕ConfigSlurper會在解析DSL時執行InjectionConfig中的代碼,並且只會產生樹狀值結構。 你想要的是從代碼中加載閉包,但是你得到了它們的執行結果,對嗎?無論如何,在調試器下記錄或檢查'it.value'是個好主意。 – 2010-11-26 11:41:24

+0

@Victor:實際上不是,我正在從slurper實際關閉; slurper的語法是'{b {c = d}}',但是使'b'成爲閉包(*,即'{b = {c = d}} *)會導致可運行閉包。 – Esko 2010-11-26 11:48:38

+0

看起來像Grails在聲明後處理taglib類。現在我看到您需要執行grailsApplication.addArtefact(TagLibArtefactHandler.TYPE,),但還是必須提供worknig示例。 – 2010-11-26 14:18:15

回答

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) 

< X:A />近爲我工作 - 註冊的標籤,除了它沒有輸出任何東西。對於Grails的taglib的out屬性,您仍然需要解決out

我沒有看到一個漂亮的方法來做到這一點,因爲沒有實例變量的訪問,而out是一個實例變量。請參閱Grails源代碼,JspInvokeGrailsTagLibTag.doStartTagInternal() - 您可能會找到一種方法。

編輯:我加了delegate.前綴,應該解析out屬性的目標對象。現在我相信我值得接受:)

1

我想要做的是,當我鍵入 到我的任何意見,那就 打印你好

我覺得有另一種方式做你想要什麼:結合模板& TAGLIB 。首先,創建一個模板,然後將其添加到您的TagLib中(不需要複雜的配置)。

在我看來,它比你的方法更簡單。

請看看這個教程: http://jan-so.blogspot.com/2008/02/example-of-template-and-taglib-with.html

+0

不幸的是,這並不適用於我的用例,因爲實際的標籤實際上是由元數據標籤組成的。我幾乎必須有能力在啓動時注入新標籤。 – Esko 2010-11-26 10:40:58