2009-10-22 14 views
6

Einfache Frage: Ich habe eine Serviceklasse (sagen wir helpersService) und eine Methode def constructURI(params). Wie kann ich diese Methode aus einer Vorlagenansicht aufrufen.Wie kann man einen Grails-Service in einer Ansicht aufrufen?

Ich habe den folgenden Code versucht, ohne Erfolg

<% def helpersService = new HelpersService() // or def helpersService 
%> 
<img src="${helpersService. constructURI(params)}"/> 

Aber ich bekomme folgendes Ergebnis:

No signature of method: com.HelpersService. constructURI() is applicable for argument types... 

oder (falls ich def helpersService)

Cannot invoke method constructURI() on null object 

Irgendwelche Ideen ?

+0

hier Beantwortet: http://stackoverflow.com/questions/2510929/how-do-i-call-a-grails-service-from-a-gsp/19378586#19378586 –

Antwort

19

Dienste sind nicht für die Verwendung in Ansichten vorgesehen. Sie könnten eine TagLib erstellen, in der Sie über die Abhängigkeitsinjektion einen Verweis auf den Service erhalten.

+0

Ja, Taglibs sind so viel sauberer den ganzen Weg herum – mbrevoort

+1

siehe auch Frage http://stackoverflow.com/questions/2510929/problem-calling-grails-service-from-gsp taglib beispiel: http://stackoverflow.com/a/7005752/160799 (sieht aber nicht sehr sauber aus. Ich bevorzuge die Lösung http://StackOverflow.com/a/1652410/160799 unten - immer noch neu bei Grails, aber ich habe keine andere Möglichkeit gefunden, die Anzeige basierend auf Zugriffsrechten für Elemente in einer Suchergebnisliste zu behandeln. – Gregor

1

Nun, ich habe eine Abhilfe mit dem folgenden Code gefunden:

def helpersService = grailsApplication.classLoader.loadClass('HelpersService').newInstance() 

aber es ist besser, Dienst über Dependency Injection zu verwenden, also werde ich versuchen, Siegfried Beratung.

7

Eine einfachere Methode ist Ihrer Ansicht nach der Annahme durch einen Controller gemacht zu werden, ist gerade, das heißt innerhalb des Modells von der Aktion auf die im Hinblick auf den Dienst eine Referenz zu übergeben:

class someController { 
    def someService 
    def someAction = { 
    render(view: 'someView', model: ['someService': someService]) 
    } 
} 

Es kann dann sein verwendet wie erwartet in der Ansicht. Bei einer Vorlage, die von einer Ansicht gerendert wird, müssen Sie natürlich auch die Referenz an die Vorlage übergeben. Nur um klar zu sein, hat S. Puchbauer recht; Dienste sollten nicht wirklich innerhalb von Views verwendet werden, und es kann zu Problemen bei der Diagnose von Problemen kommen, insbesondere bei Transaktionen und der Hibernate-Sitzung.

2

fand ich heraus, dass diese groovy Inline-Code funktioniert:

<g:select optionKey="key" from="${xxxService.getWhateverList()}" name="tarif" value="${accountInstance?.tarif}" ></g:select> 
+0

Ich habe das in einer Prise in einer universellen Header-Ansicht verwendet, da jede Seite es braucht –

+0

Nur aus dem Code ist es ziemlich offensichtlich, dass dies kein gutes Muster zu folgen ist. –

1

Sie können dies einen Tag lib leicht tun, ohne zu erstellen:

<% def xxxService = application.getAttribute("org.codehaus.groovy.grails.APPLICATION_CONTEXT").getBean("xxxService") %> 

Sie Funktionen des Dienstes dies wie nennen durch den Set-Tag:

<g:set var="versionService" bean="versionService"/> 
... 
<p>version ${versionService.clientVersion}</p> 

fand ich diese Lösung hier: http://mrhaki.blogspot.com/2013/08/grails-goodness-use-services-in-gsp.html