热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

datagrid直接编辑保存的“设计缺陷”

datagrid直接编辑保存的“设计缺陷”

今天在使用easyUIdatagrid组件的时候,碰到了一些问题,记录下来以便下次快速解决。

需求是在一张表单里会关联有一个列表,可以增删查改

以前没用easyUI的时候,这个增和改的页面我一般是用一个dialog来做,保存之后再ajax传到列表里通过hidden来进行提交。

当然现在我也可以这么做,但是我想换种方式,因为easyUIdatagrid提供了直接在datagrid上编辑的功能(Row Editing in DataGrid)。

照着官网上的demo试了一下,也就是editor的应用,编辑倒是没问题,保存也OK

但是保存的时候是直接把value转换成text来保存的,这么一来的话,value的信息就消失了。比如说是一个combobox,那么保存完就只有text的信息了。

那在保存完之前总是能获取到value的,试了一下,第一想法是想从editor生成的input下手得到数据,毕竟用form来提交是最熟悉的方式啊,但是发现editor都没有指定name的地方(也许是我不知道),所以不好得到数据。既然不行,那么还是通过datagridgetSelected方法来得到当前选中行(这里要先停止当前的编辑(endEdit)之后才能拿到填的数据)。

var row = $('#dispatches_details').datagrid('getSelected');

这里得到的row是一个json,且里面的combobox得到的都是value

到了这步,如果外层没有关联表单(也就新建一条就保存)的情况下,那么直接把row发到后台就可以保存了,之后显示就只需要text而不需要value的信息,这也许就是datagrid设计的初衷吧。但是它可能没有考虑到稍复杂的关联表单的情况,比如我们这里的业务,保存到数据库肯定是在外层表单提交的时候一起保存的,所以这个row的数据我们要暂时先记录下来。

怎么记录呢?在js里可能就只有array这种保存一串数据的数据类型了吧。于是创建了一个arrayrows)来保存row

问题又来了,那么js中的array怎么传到后台呢?这也是困扰了我一个下午的问题。

我先是直接用{”rows”:rows}这样的格式post服务器,抓了HTTP请求,实际上发的请求参数是这样的{rows[0][a], rows[0][b],......rows[1][a], rows[1][b].......}其中abrow中的字段名

看到这种情况果断还很开心啊,以为Spring可以自动绑定参数了,百度了一下于是跑到服务器

写下一行代码:

public void saveDispatches(@RequestParam("rows[]") Ddetails ddetails[])

满心以为可以直接接到数据了,结果发现接不到。又试了

public void saveDispatches(@RequestParam("rows[][]") Object ddetails[][])都不行

最后直接request.getParameter(“rows[0][a]”)这样倒是有了,尼玛啊,这样接参数还不得接到死啊。

 

不过这种方式我也只是试试而已,jsarray直接传递到后台肯定会有问题。

 

再一想,列表中的每一条记录最好都给一个name,然后value就是这条rowjson类型)。比如说类似row1:””, row2:””, row3:””

想了一下觉得还是不可行,因为参数的数量不确定,后台没有一个好的方法来接参数

 

后来从form传数据得到灵感,可以用相同的名字,然后用分隔符分开,后台可以得到一个数组,但是这样其实后台得到的就是json的数据,没办法直接绑定参数到实体了。

但是这里还有一个问题,我发现json在作为array的一个元素的时候,HTTP请求过去的时候,不会自己转换成字符串,而是会以rows[a],row[b] 这种形式发送

这并不是我们想要的,于是先要把json转换成string类型:

$.extend({
	toStr:function(json){
		var str = "";
		$.each(json, function(k,v){
			str += "," + k + ':"' + v + '"';
		});
		str = "{" + str.substring(1) + "}";
		return str;
	}
})

接下来表单提交的时候,就可以这么传数据:

	$("#dispatches_form").form('submit', {
		url:'repairs/saveDispatches',
	    onSubmit: function(param){
	    	param.ddetails = jsonArr.join('@');
	    },
	    success:function(data){
	        $.messager.progress('close');
	        $("#repairsPaper").dialog('close');
	    }				
	});

这样后台就能接到json格式的字符串了,再通过“@”分开成一条条json记录,接下来

就需要我们手动绑定到实体了,为了防止还有这种需求,于是写了一个还算通用的将json和实体绑定的方法:

	public static  T transferFromJsonObject(Class clazz,
			JSONObject jsonObject) {
		T t = null;
		try {
			t = clazz.newInstance();
			Field[] fields = clazz.getDeclaredFields();
			for (Field field : fields) {
				field.setAccessible(true);
				Object value;
				if ((value = jsonObject.get(field.getName())) != null
						&& StringUtils.isNotEmpty((String) value)) {
					if (field.getType() == Date.class) {
						SimpleDateFormat format = new SimpleDateFormat(
								"yyyy-MM-dd");
						value = format.parse((String) value);
					} else if (field.getType() == Integer.class) {
						value = Integer.parseInt((String) value);
					} else if (field.getType() == Double.class) {
						value = Double.parseDouble((String) value);
					}
					field.set(t, value);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return t;
	}

至此,虽然过程比较曲折,但是总算搞定了~



推荐阅读
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
author-avatar
吴国伟60942
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有