ビューから直接サービスを呼び出すにはどうすればよいですか? を試して${my.domain.service.method}
いますが、プロパティが見つからないと不平を言っています。
いいえ、ビューはテンプレートであるため、コントローラーを使用したくありません。
クラス ローダーを介してビュー内でサービス インスタンスを直接作成しても、使用しようとしているサービスに存在する可能性があると宣言された他のサービスは自動配線されないため、タグ ライブラリを使用することをお勧めします。
タグ ライブラリを使用すると、これらのサービスを自動配線できます。
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()
}
}
私はそれを行うための最良の方法は次のとおりだと思います:
<%
def myService = grailsApplication.mainContext.getBean("myService");
%>
このようにして、自動配線されたサービスを失うことなく、サービスインスタンスを取得します。
<%@ page import="com.myproject.MyService" %>
<%
def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>
そして${myService.method()}
、gspビューで呼び出すことができます
ビューからトランザクションサービス メソッドを呼び出すと、パフォーマンスが低下することに注意してください。すべてのトランザクション サービス メソッド呼び出しをコントローラーに移動することをお勧めします (可能な場合)。