Grails链选择没有域

时间:2013-09-20 21:00:23

标签: javascript jquery ajax grails

我正在尝试使用Ajax链接两个,可能是三个<g:select ...>语句,如此处所示Populate dropdown list using ajax In grails,但我找到的所有示例都与我正在使用的两个有很大不同。 1.我使用的是jQuery库,而不是原型。 2.我的选择值没有域对象,它们是通过服务调用从Oracle表中提取的。

我的问题看起来像这样:

<g:select name="degreeSubject" from="${majors}" noSelection="${['':'-Choose Subject-']}" value="${degreeInstance?.degreeSubject }"/>
<g:select name="degreeConcentration" from="${concentrations}" noSelection="${['':'']}" value="${degreeInstance?.degreeConcentration }"/>

如果专业和专业通过控制器但是在服务类中填充。

我在想控制器方法看起来像

def updateSelect = {
    def concentrations = degreeService.getConcentrations(params.selectedValue)
    render (template:"selectConcentration", model : ['concentrations' : concentrations])

}

但是,我无法让它发挥作用。

思考?或者有人用jQuery做了这个例子,没有使用Grails 2.2.4的域对象?

1 个答案:

答案 0 :(得分:1)

你可以真正做到这一点,而不是特定于JavaScript库。如果您使用grails内置的remoteFunction,它将为您处理jQuery部分。那么您对DegreeSubject select的要求是:

<g:select name="degreeSubject" 
          from="${majors}" 
          noSelection="${['':'-Choose Subject-']}" 
          value="${degreeInstance?.degreeSubject }"
          onChange="${remoteFunction(
            controller: 'yourControllerName', 
            action: 'updateSelect', 
            params: '\'value=\' + escape(this.value),
            onSuccess: 'updateConcentration(data)')}/>

键是调用remoteFunction的onChange事件。远程函数将对您想要的任何控制器操作进行ajax调用,但是您需要调用javascript函数来接收控制器操作的结果并填充其他选择。如果你想用简单的js做这个,你可以这样做:

function updateConcentration(items) {
    var control = document.getElementById('degreeConcentration')

    // Clear all previous options
    var i = control.length
    while (i > 0) {
        i--
        control.remove(i)
    }

    // Rebuild the select
    for (i=0; i < items.length; i++) {
        var optItem = items[i]
        var opt = document.createElement('option');
        opt.text = optItem.value
        opt.value = optItem.id
        try {
                control.add(opt, null) // doesn't work in IE
        }
        catch(ex) {
                control.add(opt) // IE only
        }
    }
}

最后你的控制器动作应如下所示:

def updateSelect(value) = {
    def concentrations = degreeService.getConcentrations(value)
    render concentrations as JSON // or use respond concentrations if you upgrade to 2.3
}