我正在使用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())。即使它似乎可以在模板上使用,也无法按预期工作