Как добавить новые теги в TagLib? - PullRequest
4 голосов
/ 29 октября 2010

Предположим, что у меня есть следующая конфигурация в моем файле 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 ]

2 голосов
/ 26 ноября 2010

Ну, это

    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 для свойства out Grails 'taglib.

Я не вижу симпатичного способа сделать это, так как нет доступа к переменным экземпляра и outпеременная экземпляраСм. Источник Grails, JspInvokeGrailsTagLibTag.doStartTagInternal () - вы можете найти способ.

EDIT : я добавил префикс delegate., который должен разрешать свойство out целевого объекта.Теперь я верю, что заслуживаю принятия:)

1 голос
/ 26 ноября 2010

Что я хочу сделать, так это то, что при вводе любого из моих представлений будет напечатано привет

Я думаю, что есть альтернативный способ сделать то, что вы намереваетесь: объединить шаблон иTagLib.Сначала создайте шаблон, затем добавьте его в свой TagLib (без сложной конфигурации).

На мой взгляд, это проще, чем ваш подход.

Пожалуйста, посмотрите этот учебник:http://jan -so.blogspot.com / 2008/02 / пример-из-шаблона-и-TagLib-with.html

...