动态方法注入 grails_Grails动态下拉菜单

动态方法注入 grails

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

示例问题

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

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

  • 用户在第一个下拉列表中选择达拉斯作为城市。 第二个下拉列表现在显示值:小牛,牛仔和游骑兵。
  • 用户在第一个下拉列表中选择匹兹堡作为城市。 现在,第二个下拉列表显示值Steelers,Pirates和Penguins。

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

动态方法注入 grails

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

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

相关文章

selenium原理python_从python角度解析selenium原理

1、selenium工作流程2、selenium工作原理(1)客户端和服务端之间实际是通过http协议进行通信&#xff0c;服务端的接口文档可参考&#xff1a;https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidelement(2)客户端按照服务端接口要求传入请求方式、…

Jmeter(二)Jmeter目录介绍

看过许多有关Jmeter的博客&#xff0c;算得上的收获颇丰&#xff1b;不过最牛逼的博客还是“官方文档”&#xff0c;官方文档是ApacheJmeter自己对自己产品的说明&#xff0c;论起对自己产品的理解程度&#xff0c;那肯定是自己嘛。。。因此推荐大家从Jmeter的官方文档开始学习…

使用Spring Data MongoDB和Spring Boot进行数据聚合

MongoDB聚合框架旨在对文档进行分组并将其转换为聚合结果。 聚合查询包括定义将在管道中执行的几个阶段。 如果您对有关该框架的更深入的细节感兴趣&#xff0c;那么 mongodb docs是一个很好的起点。 这篇文章的重点是编写一个用于查询mongodb的Web应用程序&#xff0c;以便从…

结合前段修改mysql表数据_jquery实现点击文字可编辑并修改保存至数据库

这个方法网上可以查到很多&#xff0c;但是好多只有点击文字编辑并保持&#xff0c;但是没有完整的代码写怎么保存到数据库。因为本人才疏学浅&#xff0c;费啦好长时间才写好把修改的内容只用一条sql语句保存到数据库&#xff0c;今天在这里和大家分享这是运行图片这是前台页面…

关于类、抽象类和接口的继承关系

关于类、抽象类和接口的继承关系 Java类的继承是单继承的&#xff0c;就是一个类只能继承一个类&#xff0c;但是可以通过接口来实现多继承&#xff0c;一个类可以实现多个接口。通过这种方式&#xff0c;Java类就可以实现多继承的关系。但是在继承类和实现接口的时候&#xff…

js符号转码_JS 文字符串转换unicode编码函数

AJAX传递中文字符串时必须把中文字符串编码成unicode,一般会用到JS的自带函数escape().不过找到了更好的函数来确决中文字符转换成unicode编码的函数function uniencode(text){text escape(text.toString()).replace(/\/g, "%2B");var matches text.match(/(%([0-9…

ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作

ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程。 1、创建项目 选择“文件” > “新建” > “项目”。 在“添加新项目”对话框中&#xff0c;在“已安装” “Visaul C#” “Web” 项目类型窗格中选择“ASP.NET Core Web 应用…

jsf集成spring_Spring和JSF集成:国际化和本地化

jsf集成spring如果您正在开发针对多种语言的JSF应用程序&#xff0c;那么您可能很熟悉<f&#xff1a;loadBundle>标记。 即使您的应用程序不支持使用消息捆绑包进行国际化仍然是一个好主意。 在<f&#xff1a;loadBundle>标签的作用下&#xff0c;它从Java java.ut…

java 设置两个方法互斥_分享两个操作Java枚举的实用方法

1. 前言Java枚举在开发中是非常实用的。今天再来分析几个小技巧并且回答一些同学的的疑问。首先要说明的是我的枚举建立在以下的范式之中&#xff1a;枚举统一接口范式2. 如何把枚举值绑定的下拉列表这种场景非常常见&#xff0c;如果你把状态、类别等属性封装成枚举的结构&…

微信小程序正确的异步request请求,根据经纬度获取地理位置信息

微信小程序的所有request请求都是异步的&#xff0c;不支持同步。但是在请求时可能会耗费一定时间&#xff0c;这样的话在获取返回数据时可能方法还没有执行完就已经进行赋值操作了。我遇到的就是拿到的数据为undefined。 解决办法&#xff0c;使用回调函数&#xff0c;等操作完…

Spring管理的交易说明-第2部分(JPA)

在本系列的第一部分中 &#xff0c;我展示了事务如何在普通JDBC中工作 。 然后&#xff0c;我展示了Spring如何管理基于JDBC的事务。 在本系列的第二部分中&#xff0c;我将首先展示事务如何在普通的JPA中工作。 然后展示Spring如何管理基于JPA的事务。 资金转移 为了帮助说明…

oracle_sqlserver和mysql获取表外键的方法_mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结...

mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结1. MYSQL数据库1) 创建索引CREATE INDEX index_name ON table_name(column_list)CREATE UNIQUE INDEX index_name ON table_name(column_list)修改表的方式添加索引ALTER TABLE table_name ADD INDEX in…

CCC数字钥匙设计【BLE】--车主配对之BLE OOB配对

本文主要介绍CCC3.0采用BLE进行车主配对时&#xff0c;关于蓝牙OOB配对的内容。 首先&#xff0c;介绍下BLE Pairing的一些基础知识&#xff0c;有一些基本概念。之后&#xff0c;再着重介绍CCC规范定义的BLE OOB配对流程。 1、BLE Pairing基础知识 下面先简单介绍下BLE 5.0协…

mysql 重置密码模式_mysql--重置密码

解决Mysql忘记密码&#xff1a;1、首先停止正在运行的MySQL进程&#xff1a;[rootcml5 ~]# systemctl stop mysqld2、以安全模式启动MySQL&#xff1a;[rootcml5 ~]# /usr/local/mysql/bin/mysqld_safe--skip-grant-tables &##或者在my.cnf文件下添加&#xff0c;执行完后就…

Java EE 8中的MVC 1.0:使用Facelets入门

MVC 1.0是一个基于动作的Model-View-Controller Web框架&#xff0c;它将成为将来的Java EE 8的一部分。它将与基于组件的JSF框架并存&#xff0c;并提供构建面向HTML javascript的应用程序的替代方法完全控制网址。 这篇文章总结了使用Facelets代替默认的JSP作为MVC框架的视…

Linux 查看内存状态

# 查看系统内存 命令&#xff1a;free 注&#xff1a;默认k单位显示注&#xff1a;-m 以MB注&#xff1a;-g以GB 单位显示total used free shared buffers cached Mem: 497 463 33 0 13 124 -/ buffe…

python通用数据库连接_python连接数据库的几种方式!

# -*- coding: utf-8 -*-"""-------------------------------------------------File Name&#xff1a; Database.pyAuthor : LiSenDate&#xff1a; 2018/6/26 15:51:-------------------------------------------------"""database两个库&…

Altium Designer导入pcb原件之后都是绿的

转载于:https://www.cnblogs.com/chulin/p/8342041.html

中文文本校对源码java_文字校对应该怎么校对?

如果现在给你一篇纸质文档&#xff0c;老板让你把它做成电子版的&#xff0c;这应该不是啥难事&#xff0c;你做完之后要校验一下&#xff0c;于是你一边看纸质文档一边看电子文档很努力的校对&#xff0c;恩&#xff0c;好像没有什么问题。如果老板给你100篇这样的文档&#x…

EL表达式的11隐含对象

EL表达式在不同范围如何取值&#xff1a; <%pageContext.setAttribute("book", "红楼梦");request.setAttribute("book", "水浒传");session.setAttribute("book", "三国演义");application.setAttribute(&quo…