所以我是一个新手 grails 开发人员,想知道如何根据 MVCS 设计模式正确使用服务。现在在我的服务中,我有几个函数来处理我的应用程序逻辑,然后我直接从我的 gsp 引用该服务。我读到评论 here这不是好的形式。所以现在我有<g:set var="doc" bean="documentPartService"/>
直接在我的gsp中。
所以我希望通过正确的 channel 传递信息来改变它,就像评论状态一样。
我遇到的一个小障碍是将信息从我的服务传递到我的 Controller 到我的 gsp。举个例子
<g:form name="inputForm" action="replace">
somecodehere...
<input value="Submit" type="submit">
</g:form>
然后在我的 Controller 中的替换功能中
def replace(){
render documentPartService.replace(params)
}
然后我在我的服务中有一些逻辑。
我在我看过的一些服务中看到,它们将变量作为 json 返回(documentBody 是我的服务的本地变量)
return documentBody as JSON
但我对如何在我的 Controller / View 中实际访问它感到有些困惑。我不能只是
print documentBody
在我的 Controller 中,因为它只在我的服务中定义。在我用作引用的插件服务和 Controller 中, Controller 是 1 衬里,就像我一样,它们唯一做的就是 render servicefunction()
任何人都可以阐明我应该如何正确设计这个吗?
最佳答案
当您发布表单时,操作是替换 - Controller 中的替换操作将您的服务输出呈现为输出,而不是返回绑定(bind)到替换 Controller 定义的 gsp。
从理论上讲,它应该像用户发布的那样工作 - 发布将返回将返回 JSON 响应的操作替换。
另一种选择是
def replace(){
def myValue=documentPartService.replace(params)
render (view: 'replace', model: [myValue:myValue ])
}
那么你可以有一个名为 replace 的 gsp 页面,其中定义了 ${myValue} ,这将是它的结果。
此外,使用通过 Controller 传递给它的定义值调用您的服务可能是一个更好的主意:
def replace(String val1,String val2,String val3){
def myValue=documentPartService.replace(val1,val2,val3)
[myValue:myValue ]
}
更新
考虑到您可能看到了第一个电话,即
render documentPartService.replace(params)
在我的一个插件中调用类似于上述方法。我想如果你看一下邮件列表插件,你会在 Burt 的帮助下注意到。 Controller /服务被锁定为数据类型和确切的期望。
我只能根据经验告诉您,最佳实践是,如果要定义没有理由扩展的函数,则坚持使用后一种方法。例如,在使用渲染服务输出方法的 ajaxdependancyselection 的情况下,这在某些方面有助于保持它更加向后/向前兼容。但实际上考虑一下,也许这些电话可以被锁定。将很快更新插件
关于grails - 在 Grails 中正确使用服务(根据 MVCS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24207812/