30

ビューから直接サービスを呼び出すにはどうすればよいですか? を試して${my.domain.service.method}いますが、プロパティが見つからないと不平を言っています。

いいえ、ビューはテンプレートであるため、コントローラーを使用したくありません。

4

4 に答える 4

42

クラス ローダーを介してビュー内でサービス インスタンスを直接作成しても、使用しようとしているサービスに存在する可能性があると宣言された他のサービスは自動配線されないため、タグ ライブラリを使用することをお勧めします。

タグ ライブラリを使用すると、これらのサービスを自動配線できます。

GSP ビューで<g:customTag param1="$modelObjec" param2="someString" />

taglib フォルダー内 ( yourApp/grails-app/taglib/com/something/MyAppTagLib):

package com.something

class MyAppTagLib {

    def myService  // This will be auto-wired

    def customTag = { attribs ->
        def modelObj = attribs['param1']
        def someString = attribs['param2']

        // Do something with the params

        myService.method()

        out << "I just used method of MyService class"
    }
}

あなたのマイサービス:

package com.something

class MyService {

def anotherService // This will be auto-wired

def method() {
    anotherService.anotherMethod()
}

}
于 2011-08-10T04:01:41.823 に答える
22

私はそれを行うための最良の方法は次のとおりだと思います:

<%
    def myService = grailsApplication.mainContext.getBean("myService");
%>

このようにして、自動配線されたサービスを失うことなく、サービスインスタンスを取得します。

于 2012-10-10T18:24:16.223 に答える
13
<%@ page import="com.myproject.MyService" %>
<%
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>

そして${myService.method()}、gspビューで呼び出すことができます

ビューからトランザクションサービス メソッドを呼び出すと、パフォーマンスが低下することに注意してください。すべてのトランザクション サービス メソッド呼び出しをコントローラーに移動することをお勧めします (可能な場合)。

于 2010-03-24T20:19:42.063 に答える