圣杯链选择没有域

Grails chain selects without domains

本文关键字:选择 圣杯      更新时间:2023-09-26

我正在尝试使用 Ajax 将两个,可能是三个<g:select ...>语句链接在一起,如下所示 使用 ajax 填充下拉列表 在 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 没有域对象?

你真的可以在不特定于javascript库的情况下做到这一点。 如果你使用grails内置的remoteFunction,它将为你处理jQuery部分。 然后你想要的学位学科选择是:

<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)')}/>

关键是调用远程函数的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
}