6

簡単な質問:サービスクラス(たとえばhelpersService)とメソッドがありdef constructURI(params)ます。テンプレートビューからこのメソッドを呼び出すにはどうすればよいですか。

次のコードを試しましたが成功しませんでした

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

しかし、次の結果が得られます。

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

または(私が使用する場合def helpersService

Cannot invoke method constructURI() on null object 

何か案は?

4

5 に答える 5

20

Services are not intended to be used inside views. You could create a TagLib where you can get a reference to the service via dependency injection.

于 2009-10-22T14:12:13.197 に答える
7

ビューがコントローラーによってレンダリングされていると仮定すると、より簡単な方法は、アクションからモデル内のビューにサービスへの参照を渡すことです。つまり、次のようになります。

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

その後、ビュー内で期待どおりに使用できます。ビューによってレンダリングされるテンプレートの場合、明らかにテンプレートへの参照も渡す必要があります。ただし、明確にするために、S. Puchbauer は正しいです。サービスは実際にはビュー内で使用されることは想定されておらず、特にトランザクションと Hibernate セッションに関連する問題を診断するのが難しい場合があります。

于 2009-10-30T21:26:10.170 に答える
2

このグルーヴィーなインラインコードが機能することがわかりました:

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

次のように、サービスの関数を呼び出すことができます。

<g:select optionKey="key" from="${xxxService.getWhateverList()}" name="tarif" value="${accountInstance?.tarif}" ></g:select>
于 2009-12-19T09:25:18.250 に答える
1

さて、私は次のコードで回避策を見つけました:

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

ただし、依存性注入を介してサービスを使用する方が良いので、ジークフリートのアドバイスを試してみます。

于 2009-10-22T14:43:00.200 に答える
1

set タグを使用すると、タグ lib を作成せずにこれを簡単に行うことができます。

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

ここでこのソリューションを見つけました:http://mrhaki.blogspot.com/2013/08/grails-goodness-use-services-in-gsp.html

于 2015-09-01T09:32:40.327 に答える