2013-03-05 16 views
5

Vorrei definire una funzione da utilizzare nei modelli per GStringTemplateEngine. Ho cercato di usare legame così:Come definire il binding delle funzioni all'interno del modello GStringTemplateEngine?

import groovy.text.GStringTemplateEngine 

def prettify = { 
return "***${it}***" 
} 
def var = "test" 

def f = new File('index.tpl') 
engine = new GStringTemplateEngine() 
tpl = engine.createTemplate(f).make([ 
    "var": var, 
    "prettify": prettify 
]) 
print tpl.toString() 

index.tpl:

Var: ${var} 
Prettified: <% print prettify(var) %> 

viene generata un'eccezione:

Caught: groovy.lang.MissingMethodException: No signature of method: groovy.tmp.templates.GStringTemplateScript1.prettify() is applicable for argument types: (java.lang.String) values: [test] 
Possible solutions: notify(), printf(java.lang.String, [Ljava.lang.Object;), printf(java.lang.String, java.lang.Object), printf(java.lang.String, [Ljava.lang.Object;), identity(groovy.lang.Closure), printf(java.lang.String, java.lang.Object) 

Ma non sta funzionando. Sembra che il motore di template proietti le chiusure in binding a boolean. Come lo faccio? O probabilmente dovrei scegliere un altro motore di template?

+0

Puoi prima vedere un esempio di index.tpl? Il tuo codice dovrebbe funzionare, quindi è probabilmente più un problema di come lo stai invocando nel modello. – Rhysyngsun

+0

Grazie per la tua risposta! Ho aggiunto il codice del modello. – Soid

risposta

6

Modifica della index.tpl in:

Var: ${var} 
Prettified: <% print prettify.call(var) %> 

si tradurrà in:

***test***Var: test 
Prettified: 

Se si cambia index.tpl in:

Var: ${var} 
Prettified: ${prettify.call(var)} 

L'output è:

Var: test 
Prettified: ***test*** 
+0

Funziona perfettamente, grazie mille! – Soid

Problemi correlati