我正在尝试使用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的域对象?
答案 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
}