2015-12-01 4 views
0

У меня есть список с двумя кнопками, и я хочу, чтобы каждый раз, когда я нажимаю кнопку, работаю над кодом, который я связал с этой кнопкой. Этот код находится в сервисе, а файл gsp является стандартным списком. GspМетоды в обслуживании не работают нормально в файле gsp

Чтобы вызвать службу из gsp. Я взял этот пост :(How do I call a Grails service from a gsp?), чтобы сделать это.

Проблема в том, что у меня есть два метода в сервисе, и я не знаю почему, но всегда, что я вхожу в список.gsp, и всегда, когда я нажимаю кнопку, я могу видеть отображение в консоли grails, что оба метода работают одновременно.

Это то, что я могу видеть в консоли каждый раз я нажимаю кнопку А или B:

2015-12-01 12:51:47,565 [http-bio-8090-exec-5] 
hello 
world 

То, что я хочу, чтобы кнопки, если я нажму шоу это:

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&hellip;"/></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" 
    } 

} 

ответ

1

Я вполне уверен, что это невозможно; то, что вы просите, - это отправить вызов Ajax непосредственно на службу grails. Если вы думаете об этом, как только полученный HTML-код был получен клиентом, прямое соединение между браузером и фоновым контентом (приложение grails) отсутствует, поэтому не может быть никакой магии Grails, которая позволяет это произойти.

Существует отметка grails g:remoteLink, которая позволит Ajax-вызовам действия контроллера, контроллер необходим в этот момент, потому что все новые взаимодействия, когда сгенерированный html на месте, должны быть через стандартные HTTP-запросы, а запросы обрабатываются через grails контроллеры.

Лучше всего создать контроллер, который обертывает 2 метода обслуживания и использует действия с помощью g:remoteLink или другого запроса Ajax.


Что касается использования службы в gsp вместо создания новой службы, я бы спорил в пользу использования существующего весеннего боба.

Заменить:

<%@ page import="mypackage.myService" %> 
... 
<% def LicenceTypeService = grailsApplication.classLoader.loadClass('mypackage.myService').newInstance()%> 

С:

<g:set var="myService" bean="myService"/> 
+2

Не используйте 'remoteLink' или любой из' remote' тегов. Они старые, их больше не поддерживают, они уходят в современных версиях Grails. Это плохая практика, и вы должны прекратить их использовать. –

+0

я добавлю, что вы сказали мне: <г: множество переменная = "MYSERVICE" боб = "MYSERVICE" /> \t \t \t \t \t \t \t \t

  • <г: ссылка действие = "список"><г: код сообщения = "Рассчитать тип лицензии" Args = "[EntityName]" /> $ {myService.calculate()}
  • \t \t \t \t
  • <г: ссылка действие = "список"><г: код сообщения =» Повторно вычислить тип лицензии «args =» [entityName] »/> $ {LicenceTypeService.recalculate()}
  • \t \t Но у меня все еще такая же проблема –

    +0

    @JoshuaMoore, спасибо за информацию. Есть ли современный тег для выполнения Ajax-звонков? Я использую угловой и его $ http-провайдер, поэтому я не знаком со строгим гралированием. – tylerwal