2015-06-14 2 views
0

Я новичок с ajax в Grails. Я хочу попытаться выполнить метод контроллера из gsp-кода из ajax.Выполнение функции контроллера в Grails через Ajax

Это часть моего GSP-кода:

<g:select 
    optionKey="id" name="region.id" id="region" from="${region}" noSelection="[null:' ']" 
    onchange="categoryChanged(this.value);" 
></g:select> 
<div> 
    <b>Sub-Category: </b> 
    <span id="subContainer"></span> 
</div> 
       <script> 
        function categoryChanged(regionId) { 
         $.ajax({type:'POST',data:'regionId='+regionId, url:'restorator/region/categoryChanged',success:function(data,textStatus){jQuery('#subContainer').html(data);},error:function(XMLHttpRequest,textStatus,errorThrown){}}); 
        } 
       </script> 

В параметре URL-адрес вызова $ АЯКС: реставратор представляет собой пакет, регион представляет собой контроллер в нем и categoryChanged это действие.

Это мой контроллер:

class RegionController { 

    def ajaxGetCities = { 
     println "hello" 
     def region = Region.get(params.id) 
     render region?.cities as JSON 
    } 

    def categoryChanged(long regionId) { 
     println "test" 
     Region region = Region.get(regionId) 
     def subCategories = [] 
     if (region != null) { 
      subCategories = City.findAllByRegion(region, [order:'cityName']) 
     } 
     render g.select(id:'subCategory', name:'subCategory.id', 
      from:subCategories, optionKey:'id', noSelection:[null:' '] 
     ) 
    } 
} 

В головной части я добавил <g:javascript library='jquery' /> Когда я пытаюсь изменить параметр в выберите тег я не вижу выход на консоль, которая должна быть показана от линии println "test" внутри контроллера. Это означает, что функция контролера никогда не называется, что я делаю неправильно? Как я могу убедиться, что этот вызов функции действительно происходит?

ответ

1

Щелкните правой кнопкой мыши на странице, проверьте элемент и проверьте, нет ли ошибок в консоли.

Кроме того, вы должны указать URL-адрес таким образом:

url: '${createLink(controller: 'region', action: 'categoryChanged')}', 
0

Это будет меньше кода, если вы используете Grails remoteLink функцию.

<g:remoteLink action="makeProduct" id="${productInstance.id}" before="showSpinner('#spinner1')" onComplete="hideSpinner('#spinner1')" update="product_status">Make Product</g:remoteLink> 
<div id="product_status"></div> 

Этот код будет запрашивать действие асинхронно и обновить product_status DIV с результирующей HTML от действия. Вы также можете добавить прядильщиков на странице, чтобы дать пользователю некоторую обратную связь.

Смежные вопросы