所以,我有一个域类,它有很多字段。我在GSP准备好了五个下拉菜单,数据在任何下拉菜单的onChange上得到了适当的过滤,但是有一个问题。对于在下拉列表中选择的一些组合,我们在数据库中没有数据,并且这些组合不是固定的。
所以,我认为有可能一旦在第一个下拉列表(或任何下拉列表)上进行选择,其余的下拉列表将取决于第一个选择(意思是其他下拉列表仅填充数据库中可用数据的那些值,这也应该遵循后续选择。
此外,我已经看到了依赖下拉列表的示例,但我看到的所有示例都有多个下拉列表,但每个下拉列表都从不同的域类中获取值
甚至可以只使用一个域类来执行此操作吗?
这就是我的index.gsp的样子:
<html>
<head>
<g:javascript src="jquery-1.10.2.js"/>
<g:javascript src="prototype.js"/>
</head>
<body>
<form>
<g:select from="['DESKTOP/LAPTOP','SMARTPHONES','OTHERS','TABLETS']" name="device" id ="device"
onchange="${remoteFunction(
controller:'Pgtyp',
action:'ajaxGetMv',
// params:'\'mv=\' + escape(this.value)',
params:'\'device=\'+this.value+\'&mv=\'+$(\'mv\').value+\'&browser=\'+$(\'browser\').value+\'&pagetype=\'+$(\'pagetype\').value+\'&platform=\'+$(\'platform\').value' ,
onSuccess: 'printpgtyp(data)')}"
></g:select>
<g:select from="['CORESITE','MWEB']" name="platform" id ="platform"
onchange="${remoteFunction(
controller:'Pgtyp',
action:'ajaxGetMv',
// params:'\'mv=\' + escape(this.value)',
params:'\'platform=\'+this.value+\'&mv=\'+$(\'mv\').value+\'&browser=\'+$(\'browser\').value+\'&pagetype=\'+$(\'pagetype\').value' ,
onSuccess: 'printpgtyp(data)')}"
></g:select>
<g:select from="['CHECKOUT','HOMEPAGE','OTHERS', 'DEPARTMENT', 'PRODUCT','SEARCH', '(All)','SHELF']" name="pagetype" id ="pagetype"
onchange="${remoteFunction(
controller:'Pgtyp',
action:'ajaxGetMv',
// params:'\'mv=\' + escape(this.value)',
params:'\'pagetype=\'+this.value+\'&mv=\'+$(\'mv\').value+\'&browser=\'+$(\'browser\').value+\'&platform=\'+$(\'platform\').value' ,
onSuccess: 'printpgtyp(data)')}"
></g:select>
<g:select from="['INTERNET EXPLORER','GOGGLE CHROME','SAFARI', 'MOZILLA', 'OTHERS']" name="browser" id ="browser"
onchange="${remoteFunction(
controller:'Pgtyp',
action:'ajaxGetMv',
// params:'\'mv=\' + escape(this.value)',
params:'\'browser=\'+this.value+\'&mv=\'+$(\'mv\').value+\'&pagetype=\'+$(\'pagetype\').value+\'&platform=\'+$(\'platform\').value' ,
onSuccess: 'printpgtyp(data)')}"
></g:select>
<g:select from="['AFFILIATES', 'CSE','DISPLAYADS','EMAIL','MOBILEWEB','OTHERS','ORGANIC','SEO', 'SEM']" name="mv" id = "mv"
onchange="${remoteFunction(
controller:'Pgtyp',
action:'ajaxGetMv',
// params:'\'mv=\' + escape(this.value)',
params:'\'mv=\'+this.value+\'&browser=\'+$(\'browser\').value+\'&pagetype=\'+$(\'pagetype\').value+\'&platform=\'+$(\'platform\').value' ,
onSuccess: 'printpgtyp(data)')}"
></g:select>
</form>
<script>
function printpgtyp(data)
{
console.log(data)
}
</script>
</body>
</html>
答案 0 :(得分:0)
为了回答你的问题,你需要做的是产生1 g:select元素和onChange调用本地java脚本而不是remoteFunction,因为你猜对了它自己的remoteFunction只会更新一个Div,您可以尝试使用半冒号并将多个远程功能传递给一个onchange,而不是我曾尝试过的。
因此,请回答:
I want my selects dropdowns to auto populate with Ajax in Grails website
因为这可能是最明智的答案
你的gsp ......
<g:select from="['DESKTOP/LAPTOP','SMARTPHONES','OTHERS','TABLETS']" name="device" id ="device" onchange="myMultiUpdater(this.value);"></g:select>
<div id="selectbox1">
</div>
<div id="selectbox2">
</div>
<div id="selectbox3">
</div>
<g:javascript>
function myMultiUpdater(id) {
$.get('${createLink(controller:"Controller1", action: "action1")}?id='+id+'',function(e){
$('#selectbox1').hide().html(e).fadeIn('slow');
}
$.get('${createLink(controller:"Controller2", action: "action1")}?id='+id+'',function(e){
$('#selectbox2').hide().html(e).fadeIn('slow');
}
}
$.get('${createLink(controller:"Controller3", action: "action1")}?id='+id+'',function(e){
$('#selectbox3').hide().html(e).fadeIn('slow');
}
}
<g:javascript>
您的控制器
controller1 {
def action1() {
def s=params.id
String domclass1= (s.substring(0,1).toUpperCase())
String domclass2=s.substring(1,s.length())
String domclass=domclass1+domclass2.toLowerCase()
Class domainClass = grailsApplication?.domainClasses.find { it.clazz.simpleName ==domclass+'Cities' }?.clazz
def cities=loadCities(domainClass)
render(template: 'cities', model: [cities: cities])
}
}
您只需扩展对象,或者不使用get use getJSON并传回特定值 - 请参阅上面对插件中selectJs.gsp的注释。在这些选择框中,您还可以加载默认选择框或保留em,因为它们在进行选择之前不显示任何内容。此方法加载整个内容 - 插件侧重于提取元素并显示给定表/ domainClass的相关定义元素
并使用 g:javascript 标记,您可以使用
<g:remoteFunction controller="controller3" action="action1" onComplete="'selectbox3'" params= "\'id=\'+ id"/>
而不是
$.get('${createLink(controller:"Controller3", action: "action1")}?id='+id+'',function(e){
$('#selectbox3').hide().html(e).fadeIn('slow');
}
因为他们会做同样的事情,顶部看起来更整洁,更多的gsp在javascript中查找。你的选择。