实现级联更新效果有多种方式,现只介绍用jquery框架的ajax技术实现的方式,个人认为使用jquery的方式更好更灵活,因为它只负责传数据,如果用grails自带的异步更新,简单的还可以,如果是复杂一点的就比较难搞。

下列代码无需考虑业务意义

jquery的ajax实现:

1.GSP中_form.gsp的简略代码:

<div><g:selectid="company"name="company.id"from="${companyInstanceList}"/></div><div><g:selectid="salaryType"name="salaryType"from="${unassignedType}"/></div><div><g:selectid="operator"name="operator.id"from="${managements}"/></div>2.javascript代码<script>$("#company").bind("change",function(){$("#salaryTypeoption").remove();varcompany=$("#company").val()$.ajax({url:"findUnassignedType",type:"POST",data:{'companyId':company},success:function(result){//此处result返回的是一个map,key是salaryType,value是salaryType下的operator选项$.each(result,function(key,value){$("#salaryType").append("<optionvalue="+key+">"+key+"</option>")$("#operatoroption").remove()for(vari=0;i<value.length;i++){$("#operator").append("<optionvalue="+value[i].id+">"+value[i].name+"</option>")}});}});});$("#company").change();$("#salaryType").bind("change",function(){$("#operatoroption").remove();varsalaryType=$("#salaryType").val()$.ajax({url:"findManagements",type:"POST",data:{'salaryType':salaryType},success:function(result){for(vari=0;i<result.length;i++){$("#operator").append("<optionvalue="+result[i].id+">"+result[i].name+"</option>")}}});});$("#salaryType").change();})</script>3.controller代码/***ajax查询未分派完的公司的项目种类*@Authorluoshida*/deffindUnassignedType(){defcAssigns=CAssign.findAllByCompany(Company.get(params.companyId.toLong()))defunassignedType=CAssign.constraints.salaryType.inListcAssigns.each{elem->unassignedType=unassignedType-elem.salaryType}Mapmap=newHashMap()unassignedType.each{elem->Listoperators=newArrayList()Management.findAllBySalaryTypeAndAssignType(unassignedType.get(0),"企业专管员").each{elem02->operators.add(elem02.operator)}map.put(elem,operators)}rendermapasJSON}/***ajax查找项目种类对应的专管员*@Authorluoshida*/deffindManagements(){defmanagements=Management.findAllBySalaryTypeAndAssignType(params.salaryType,"企业专管员")Listoperators=newArrayList()managements.each{elem->operators.add(elem.operator)}renderoperatorsasJSON}注意,返回的时候必须要以JSON字符串的类型返回,此处要导入一个包grails.converters.JSON