2016-03-24 13 views
1

Also ich versuche, eine verbesserte Version der verfügbaren Form-Tags zu implementieren, so dass ich FormTagLib erweitern. Ich versuche einen einfachen Test mit dem Tag textField zu machen, aber ich kann nicht einmal herausfinden, welche Methode auf dem Tag aufgerufen wird. I außer Kraft gesetzt haben jede verfügbare textField Methode zur Verfügung, aber keiner von ihnen sind immerGrails: wie FormTagLib zu erweitern?

class TestTagLib extends FormTagLib { 
static namespace = "test" 

@Override 
Object textField(Map attrs) { 
    return super.textField(attrs) 
} 

@Override 
Object textField() { 
    return super.textField() 
} 

@Override 
Object textField(Map attrs, CharSequence body) { 
    return super.textField(attrs, body) 
} 

@Override 
Object textField(Closure body) { 
    return super.textField(body) 
} 

@Override 
Object textField(Map attrs, Closure body) { 
    return super.textField(attrs, body) 
} 
} 

getroffen Ich habe versucht, Breakpoints, Konsolausgaben für jede Methode setzen, aber es passiert nichts. Die Eingabefelder werden gerade erzeugt, aber es scheint nicht meinen Code dafür zu verwenden. Heck ich habe sogar versucht komplett den Anruf der Superklasse zu entfernen und alles funktioniert noch.

Was fehlt mir hier und wie kann ich die Erstellung des Textfelds abfangen, damit ich meine Änderungen vornehmen kann?

Antwort

0

Haben Sie sich angeschaut, wie die FormTagLib implementiert ist?

Ich denke, die meisten Tags sind definiert als Verschlüsse, wie textField = { … }. Dies führt dazu, dass die Implementierung der textField Methode durch den Code zwischen {} ersetzt wird.

Ich glaube, Ihr Beispiel ist eine Demonstration der Risiken der Erweiterung. Ich denke Delegation ist normalerweise eine bessere Lösung. Nicht sicher, ob die TagLibs Frühlingsbohnen sind, aber Sie könnten etwas wie dieses versuchen (nicht getestet):