用Mixin类扩展Groovy MarkupTemplateEngine

时间:2019-07-09 09:27:01

标签: templates groovy

我正在使用Groovy MarkupTemplateEngine生成一些xhtml

我想拥有一个扩展类库,可以根据需要将其混合到BaseTemplate类中。例如,实用程序类


class FormField {

    static void textField(String title, String content) {

        div(class: 'form-field') {
            div(title, class: 'form-field-label')
            div(content, class: 'form-field-content')
        }

    }


    static void checkboxField(String title, boolean state) {

        String suffix = state ? 'checked' : 'unchecked';
        String src = 'img/common/checkbox_' + suffix + '.svg';


        img(src: src, class: 'checkbox-image')
        span(title, class: 'form-field-label')
    }
}

这提供了一些更高层次的结构,您可以根据需要将其混入模板中

我知道您可以将这些方法添加到自定义基本模板类中,但是可能会将许多方法添加到单个类中,并且您将不具有IDE自动完成功能。

这就是我一直在尝试的东西:

abstract class ExtendedBaseTemplate extends BaseTemplate {


    ExtendedBaseTemplate(MarkupTemplateEngine templateEngine,
                         Map model, Map<String, String> modelTypes,
                         TemplateConfiguration configuration) {

        super(templateEngine, model, modelTypes, configuration)
    }


    // single extension method
    void f0() {
        p('hi from f0()')
    }
}

还有一些测试模板

assert GroovySystem.version == '2.5.7'
assert this instanceof BaseTemplate
assert this.class.getSimpleName().startsWith('GeneratedMarkupTemplate')


def f1() {
    p('hi from f1()')
}
assert this.metaClass.methods*.name.contains('f1')


// add a new method via metaClass
this.metaClass.f2 = {
    p('hi from f2()')
}
// seems to have worked
assert this.metaClass.methods*.name.contains('f2')


// TODO mixin some required utility classes here 


html {
    body {
        h1('Test')


        // ok renders as <p>`hi from f0()`</p>
        f0()

        // ok rendered as <p>hi from f1()</p>
        f1()

        // What? rendered as <p>hi from f2()</p>
        p(f2())

        // What? rendered as <f2/> -> method missing
        f2()
    }
}

我什至无法通过模板metaClass添加其他方法(f2())。即使它似乎可以在模板上使用,也无法按预期工作

0 个答案:

没有答案