2009-10-22 17 views
6

Proste pytanie: Mam klasę usług (powiedzmy helpersService) i metodę def constructURI(params). Jak mogę wywołać tę metodę z widoku szablonu.Jak wywołać usługę Grails w widoku?

Próbowałem następujący kod bez powodzenia

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

Ale pojawia się następujący wynik:

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

lub (w przypadku używam def helpersService)

Cannot invoke method constructURI() on null object 

pomysłów ?

+0

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

Odpowiedz

19

Usługi nie są przeznaczone do użycia w widokach. Można utworzyć TagLib, gdzie można uzyskać odwołanie do usługi za pomocą wtrysku zależności.

+0

Tak, taglibs są tak dużo czystsze dookoła – mbrevoort

+1

zobacz także pytanie http://stackoverflow.com/questions/2510929/problem-calling-grails-service-from-gsp taglib przykład: http://stackoverflow.com/a/7005752/160799 (dla mnie to jednak nie wygląda na bardzo czyste. Wolę rozwiązanie http://stackoverflow.com/a/1652410/160799 poniżej - wciąż nowe dla Grails, ale nie znalazłem innego sposobu obsługi wyświetlania na podstawie praw dostępu dla pozycji na liście wyników wyszukiwania). – Gregor

1

Dobrze znalazłem obejście z następującego kodu:

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

Jednak lepiej jest korzystać z usługi za pomocą wstrzykiwania zależności, więc postaram się porady Siegfried.

7

Łatwiejszy sposób, zakładając, że widok jest renderowany przez kontrolera, jest po prostu przekazać referencję do usługi z działania do widoku w modelu, to znaczy:

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

Następnie może być używane tak, jak można się tego spodziewać w widoku. W przypadku szablonu renderowanego przez widok oczywiście musisz przekazać odwołanie do szablonu. Dla jasności, S. Puchbauer ma rację; usługi nie powinny być używane w widokach, a problemy z nimi związane mogą być trudne, szczególnie w przypadku transakcji i sesji hibernacji.

2

I okazało się, że to porywające kod inline działa:

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

można wywołać funkcji serwisu, podobnie jak to:

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

Użyłem tego w szczyptie w widoku nagłówka uniwersalnego, ponieważ każda strona będzie go potrzebować. –

+0

Po prostu z kodu jest całkiem oczywiste, że nie jest to dobry wzór do naśladowania. –

Powiązane problemy