使用的grails版本是1.1,在页面实现省市的地区级联显示。
以下是领域对象
class Province implements Comparable {
String name
Integer lawyerCount = 0
SortedSet cities
static hasMany = [cities: City]
static constraints = {
name()
}
static mappings = {cities fetch : 'join'}
String toString(){"${name}"}
int compareTo(obj){id.compareTo(obj?.id)}
}
class City implements Comparable{
String name
Integer lawyerCount = 0
Province province
static belongsTo = Province
static constraints = {
}
String toString(){"${name}"}
int compareTo(obj){id.compareTo(obj.id)}
}
在gsp中省的代码是
<g:select optionKey="id" from="${Province.list()}" name="province.id" value="${lawOrgInstance?.province?.id}" οnchange="${remoteFunction(controller:'city', action:'listByProvince', params:'\'id=\'+this.value', update:'city.id')}"></g:select>
注意这里的onchange方法调用的是CityController里面的listByProvince方法。当选项变化时,会填充id='city.id'的标签。
<div id="city.id"><select><option>请选择城市</option></select></div>
那么这个方法的代码如下
def listByProvince = {
assert null != params.id
params.max = Math.min( params.max ? params.max.toInteger() : 10, 100)
render g.select(optionKey:"id", from:City.findAllByProvince( Province.get(params.id), params), name:"city.id")
}
注意这里的标签作为方法调用。
对于没有涉及到部分,均采用命令行工具自动生成的。
在grails中,级联显示就是这么简单。