通过 Ajax 在 Grails 中执行控制器功能
Execute controller function in Grails via Ajax
我是 Grails ajax 的新手。我想尝试从 ajax.
的 gsp 代码执行控制器方法
这是我的 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参数中:restorator是一个package,region是里面的一个controller,categoryChanged是一个action。
这是我的控制器:
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' />
当我尝试更改 select 标记中的选项时,我没有看到控制台的输出,它应该从控制器内的 println "test"
行显示。这意味着实际上从未调用过 controlloer 函数,我做错了什么?我如何确保此函数调用确实发生?
在页面上右击Inspect Element,在console中查看是否有错误。
此外,您应该这样指定 URL:
url: '${createLink(controller: 'region', action: 'categoryChanged')}',
如果使用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。您还可以在页面上添加微调器来给用户一些反馈。
我是 Grails ajax 的新手。我想尝试从 ajax.
的 gsp 代码执行控制器方法这是我的 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参数中:restorator是一个package,region是里面的一个controller,categoryChanged是一个action。
这是我的控制器:
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' />
当我尝试更改 select 标记中的选项时,我没有看到控制台的输出,它应该从控制器内的 println "test"
行显示。这意味着实际上从未调用过 controlloer 函数,我做错了什么?我如何确保此函数调用确实发生?
在页面上右击Inspect Element,在console中查看是否有错误。
此外,您应该这样指定 URL:
url: '${createLink(controller: 'region', action: 'categoryChanged')}',
如果使用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。您还可以在页面上添加微调器来给用户一些反馈。