2015-06-14 37 views
0

我是一個在Grails中使用ajax的新手。我想嘗試從ajax的gsp-code中執行一個控制器方法。通過Ajax在Grails中執行控制器功能

這是我的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> 

在$ Ajax調用的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: '${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> 

此代碼將異步請求操作並使用操作中生成的HTML更新product_status div。您也可以在頁面上添加旋鈕,爲用戶提供一些反饋。