我有一个带有两个按钮的列表,我希望每次按下按钮时,都可以使用与此按钮关联的代码。此代码在服务中,gsp文件是默认的list.gsp
从gsp调用服务。我接受了这篇文章:(How do I call a Grails service from a gsp?)来做这件事。
问题是我在服务中有两种方法,我不知道为什么,但总是我输入list.gsp并且总是我按下按钮我可以看到在控制台中显示的grails两种方法同时工作。
每次按下按钮A或B时,我都可以在控制台中看到:
2015-12-01 12:51:47,565 [http-bio-8090-exec-5]
hello
world
我想要的是,如果我按下按钮A显示:
2015-12-01 12:51:47,565 [http-bio-8090-exec-5]
hello
如果我按下按钮B显示:
2015-12-01 12:51:47,565 [http-bio-8090-exec-5]
world
这就是我每次运行时都可以在控制台中看到并输入gsp.file并且我希望不运行代码,除非我按下按钮:
2015-12-01 12:51:47,565 [http-bio-8090-exec-5]
hello
world
提前致谢
这是我在gsp中的代码:
<%@ page import="com.app.test" %>
<%@ page import="mypackage.myService" %>
<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="main">
<g:set var="entityName" value="${message(code: 'licenseType.label', default: 'LicenceType')}" />
<title><g:message code="default.list.label" args="[entityName]" /></title>
</head>
<body>
<a href="#list-licenseType" class="skip" tabindex="-1"><g:message code="default.link.skip.label" default="Skip to content…"/></a>
<div class="nav" role="navigation">
<ul>
<li><g:link class="create" action="create"><g:message code="default.new.label" args="[entityName]" /></g:link></li>
<% def LicenceTypeService =
grailsApplication.classLoader.loadClass('mypackage.myService').newInstance()%>
<li><g:link action="list"><g:message code="Calculate Licence Type" args="[entityName]" /><span>${myService.calculate()}</span></g:link></li>
<li><g:link action="list"><g:message code="Re-Calculate Licence Type" args="[entityName]" /><span>${myService.recalculate()}</span></g:link></li>
</ul>
</div>
在服务中:
class MyService {
def calculate(){
println "hello"
}
def recalculate(VoiceUser vUser){
println "world"
}
}
答案 0 :(得分:1)
我很确定这是不可能的;您要问的是直接向Grails服务发送Ajax调用。如果您考虑一下,一旦客户端收到生成的HTML,浏览器和后端(grails应用程序)之间就没有直接连接,因此不会有任何grails魔法允许这种情况发生。< / p>
有一个grails标记g:remoteLink允许Ajax调用控制器操作,此时控制器是必需的,因为生成的html到位后所有新的交互都必须通过标准HTTP请求和请求通过grails控制器处理。
最好的办法是创建一个包含2个服务方法的控制器,并将操作与g:remoteLink
或其他Ajax请求一起使用。
替换:
<%@ page import="mypackage.myService" %>
...
<% def LicenceTypeService = grailsApplication.classLoader.loadClass('mypackage.myService').newInstance()%>
使用:
<g:set var="myService" bean="myService"/>