Grails动态下拉菜单

最近,我有一个UI要求,客户希望从两个单独的下拉列表中选择值。 第一个下拉列表的值实质上过滤了第二个下拉列表的值。 鉴于我们支持的财务项目对UI的要求并不严格,因此我不得不进行一些初步的学习和实验,以实现良好的实施。 这篇博客条目详细介绍了如何在Ajax和最少JavaScript的Grails中实现动态下拉菜单。

示例问题

人为的动态下拉菜单可以在下面描述:

用户想选择一个城市的运动队。 用户首先为下拉菜单选择一个值以选择城市。 第二个下拉列表与该城市的运动队一起过滤。 一个例子来澄清:

  • 用户在第一个下拉列表中选择达拉斯作为城市。 第二个下拉列表现在显示值:小牛,牛仔和游骑兵。
  • 用户在第一个下拉列表中选择匹兹堡作为城市。 现在,第二个下拉列表显示“钢人”,“海盗”和“企鹅”的值。

Grails中的高级设计

在进入细节之前,我们可以退后一步,描述如何在grails框架中完成动态下拉菜单。

  • 在gsp页面上,使用城市列表创建选择下拉列表。
  • 在更改城市下拉列表时,将ajax调用与选定城市的参数一起发送到服务器。
  • 服务器上的控制器将接收该参数,并根据所选城市寻找球队。
  • 返回带有新选择团队下拉列表的模板,为模型提供带有已过滤团队列表的模型。

我们将在下面继续介绍代码片段。 该代码使用Grails 2.0进行了演示。

域对象

此示例的域对象非常简单:带有名称的City对象和Team对象。

package dropdownclass City {String namestatic hasMany = [teams: Team]static constraints = {}
}package dropdownclass Team {String namestatic belongsTo = [city: City]static constraints = {}String toString() {name}
}

Gsp页面

一个gsp页面包含直接来自GORM调用的城市列表。 这通常由默认生成的grails gsp页面执行和演示。 注意remoteFunction的使用。 这是一个grails gsp实用程序,它对服务器进行ajax调用,并为要返回的dom部分提供“ update”。

对于团队下拉菜单,我们将从一个空的选择标签开始。 下面是一个片段。

<g:select name="city.id" from="${City.list()}" optionKey="id" optionValue="name"noSelection="['':'Choose City']"onchange="${remoteFunction (controller: 'city',action: 'findTeamsForCity',params: ''city.id=' + this.value',update: 'teamSelection')}" />....<td id="teamSelection" valign="top"><select><option>Choose Team</option></select></td>

用于过滤的控制器

控制器将具有一个封闭区,该封闭区将输入城市ID,然后使用它来提供与城市相关的团队。 该关闭是通过ajax调用的。 闭合呈现模板和模型。

def dynamicDropdown闭合仅用于导航。 按照约定,它会呈现相同名称的gsp。

package dropdownclass CityController {static scaffold = City// just navigation to the gspdef dynamicDropdown = {}def findTeamsForCity = {def city = City.get(params.city.id)render(template: 'teamSelection', model:  [teams: city.teams])}
}

模板

该模板用于替换gsp中dom的一部分。 它接受提供的任何模型。

<!-- This template renders a drop down after a city is selected --><g:select name="team.id" from="${teams}" optionValue="name"optionKey="id"/>

结论

有多种方法可以完成动态下拉列表。 可以使用本机jQuery,甚至可以使用本机JavaScript。 我选择利用grails的内置功能并减少对客户端编程的依赖。 事实证明,这是干净,快速且非常简单的!

参考: Assar Java Consulting博客中来自JCG合作伙伴 Nirav Assar的Grails Dynamic Dropdown 。


翻译自: https://www.javacodegeeks.com/2012/06/grails-dynamic-dropdown.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java大系】Java快速教程

感谢原作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei Java是面向对象语言。这门语言其实相当年轻&#xff0c;于1995年才出现&#xff0c;由Sun公司出品。James Gosling领导了Java的项目小组。该项目的最初只想为家电设计一门容易移植的语言。然而&am…

[转]前端构建工具gulpjs的使用介绍及技巧

本文转自&#xff1a;http://www.cnblogs.com/2050/p/4198792.html gulpjs是一个前端构建工具&#xff0c;与gruntjs相比&#xff0c;gulpjs无需写一大堆繁杂的配置参数&#xff0c;API也非常简单&#xff0c;学习起来很容易&#xff0c;而且gulpjs使用的是nodejs中stream来读取…

Eclipse侧边栏Outline设置字体

Eclipse的Outline&#xff0c;Project Explorer&#xff0c;Call Hierarchy等小窗口是很方便的功能&#xff0c;但是遇到函数名或文件名很长的情况&#xff0c;就只能显示前半段。尽管Eclipse的自定义程度很高&#xff0c;但是却找不到这些窗口的字体设置。 经过一番摸索后&…

AOP的简单介绍

为什么使用AOP&#xff0c;一个简单的回答这个问题的方法是显示一个横切关注点的实现而不使用AOP。 考虑一个简单的服务及其实现&#xff1a; public interface InventoryService {public Inventory create(Inventory inventory);public List<inventory> list();public I…

java实现表达式求值_如何编写一个高效的Java表达式求值程序

虽然&#xff0c;这个题目是有一点夺人眼球&#xff0c;但我真实这么做了(关是以否信任基准测试效果&#xff0c;这是其他一个话题)。所以&#xff0c;上周我一贯在找一个小型、适用的竞赛争辩数学表达式的类库。有功夫我在stackoverflow上看到了一个帖子&#xff0c;里面举荐的…

两张表的笛卡尔积用sql语句

第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小SELECT * FROM table1 CROSS JOIN table2转载于:https://www.cnblogs.com/henuyuxiang/p/6811717.html

[dpdk] 读官方文档(3)

续前节&#xff0c; 测试小程序 1. 想编译测试程序首先需要设置两个环境变量&#xff0c;为什么呢&#xff0c;因为测试程序的Makefile里用了。。。 rpm装了打包好的devel包&#xff0c;这个rpm也会自带这两个环境变量。就是说写第三方程序的时候&#xff0c;习惯上&#xff0c…

比较OpenDDR和WURFL

量身定制的Web内容通常受益于定制&#xff0c;以考虑多种因素&#xff0c;例如屏幕大小&#xff0c;标记语言支持和图像格式支持。 此类信息存储在“设备描述存储库”&#xff08;DDR&#xff09;中。 WURFL和OpenDDR项目都提供了访问DDR的API&#xff0c;以简化并促进适应其交…

逻辑表达式——黑纸白纸

一、问题描述 有A、B、C、D、E五个人&#xff0c;每人额头上都贴了一张黑色或白色的纸条。五人对坐&#xff0c;每人都可以看到其他人额头上的纸的颜色&#xff0c;但都不知道自己额头上的纸的颜色。五人互相观察后&#xff0c; A说&#xff1a;“我看见有三个人额头上贴的是白…

java 1.6u29 下载_jdk1.6 64位下载|JDK 6(Java SE Development Kit)下载6u43 64位官方版_java运行环境 IT猫扑网...

jdk1.6 64位适用于x64的系统安装的java运行环境&#xff0c;Java SE Development Kit6是java开发人员必备的产品&#xff0c;也叫做jdk6&#xff0c;欢迎下载使用。官方介绍适用于您的计算机(windows)的 Java 软件&#xff0c;即 Java Runtime Environment&#xff0c;也称为 J…

ZK 6中的MVVM初探

MVVM与MVC 在上一篇文章中&#xff0c;我们已经看到Ajax框架ZK如何采用CSS选择器启发的Controller来在View中连接UI组件并监听它们的事件。 在此ZK MVC模式下&#xff0c; View中的UI组件无需绑定到任何Controller方法或数据对象。 使用选择器模式作为将View状态和事件映射到Co…

消失循环的2023?你都做了什么? | 2023 年度总结

2023年度总结 -- 今年都做了什么事&#xff1f; 前言心态关键词感悟 记录申请软著独立游戏技术成长 共勉 前言 又到了一年一次年度总结的时候了。我们常常感叹时间飞逝&#xff0c;却又没办法让它放慢的脚步。那就将2023写下来&#xff0c;让它在时间的长河中留下一丝记忆。 心…

由于SSH配置文件的不匹配,导致的Permission denied (publickey)及其解决方法

读者如要转载&#xff0c;请标明出处和作者名&#xff0c;谢谢。 地址01&#xff1a;http://space.itpub.net/25851087 地址02&#xff1a;http://www.cnblogs.com/zjrodger/ 作者名&#xff1a;zjrodger 【问题发生环境和相关参数】(1)OS&#xff1a;Win7 32Bit. (2)Git&#…

java语言基本语法_Java语言基本语法

Java语言基本语法一、标识符和关键字标识符在java语言中&#xff0c;用来标志类名、对象名、变量名、方法名、类型名、数组名、包名的有效字符序列&#xff0c;称为“标识符”&#xff1b;标识符由字母、数字、下划线、美元符号组成&#xff0c;且第一个字符不能是数字&#xf…

Maven的鸟瞰图

我们每天要做的一件事是使用Maven通过发出诸如mvn install之类的构建命令来构建我们的项目。 然后&#xff0c;Maven查看我们项目的配置文件&#xff08;亲切地称为POM&#xff09;&#xff0c;神奇地找出要执行的操作&#xff0c;并且&#xff0c;嘿&#xff0c;您的构建已完成…

node源码详解(五)

本作品采用知识共享署名 4.0 国际许可协议进行许可。转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.org/topic/56ed6735b705742136388fa6 本博客同步在http://www.cnblogs.com/papertree/p/5295344.html 在上一篇博客&#xff…

分层图+最短路算法 BZOJ 2763: [JLOI2011]飞行路线

2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBDescription Alice和Bob现在要乘飞机旅行&#xff0c;他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务&#xff0c;设这些城市分别标记为0到n-1&#xff0c;一共有m种航线&#xff0c;每…

java web 保护_java web项目请求控制及简单漏洞防范

背景&#xff1a;当时项目没用什么框架&#xff0c;过滤器&#xff0c;请求限制等都需要自己手写。1、请求加时间戳在后台过滤器中可以加判断&#xff0c;如果请求时间戳与服务器时间相差太大&#xff0c;可以返回异常&#xff0c;具体情况可以具体使用。请求中加时间戳的示例如…

Maven最佳实践

尽管Maven提供了“配置之上的约定”解决方案&#xff0c;但是仍然有足够多的必要配置引起严重的头痛。 在这篇文章中&#xff0c;我将与您分享一些最佳实践&#xff0c;以简化对POM文件的维护。 请勿使用已弃用的引用&#xff0c;例如$ {artifactId}或$ {pom.artifactId}。 使用…

51Nod - 1381 硬币游戏

51Nod - 1381 硬币游戏 有一个简单但是很有趣的游戏。在这个游戏中有一个硬币还有一张桌子&#xff0c;这张桌子上有很多平行线&#xff08;如下图所示&#xff09;。两条相邻平行线之间的距离是1&#xff0c;硬币的半径是R&#xff0c;然后我们来抛硬币到桌子上&#xff0c;抛…