【问题标题】:Dependent drop-downs with one domain class in GrailsGrails 中具有一个域类的相关下拉列表
【发布时间】:2014-07-11 10:04:04
【问题描述】:

所以,我有一个域类,它有很多字段。我在 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>

【问题讨论】:

标签: javascript jquery grails drop-down-menu


【解决方案1】:

为了回答您的问题,您需要做的是使用 onChange 生成 1 个 g:select 元素,该元素调用本地 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 使用 getJSON 并返回特定值 - 请参阅插件中关于 selectJs.gsp 的上述评论。在这些选择框内,您还可以加载默认选择框或保留 em,因为在做出选择之前它们不会显示。此方法加载整个内容 - 插件专注于提取元素并显示给定表/域类的相关定义元素

还有一个 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');
          }

因为他们会做同样的事情,所以顶部看起来更整洁,并且在 javascript 中看起来更 gsp。您的选择。

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多