【LigerUI实战】Grid弹出编辑popup
最近为分公司的项目做外援,做起了全栈的活。被公司自研架构磨灭的几乎忘掉了其他技能,正好新项目决定重新搭个架构,与同事们讨论过后,决定Spring+MyBatis+SpringMVC+CXF+LigerUI。除了Spring比较熟悉外,其他的还是新接触,不过现在来看,MyBatis和SpringMVC还真是简单易学。不过我的前端知识很有限,干起活来还真是不顺手,所以决定把LigerUI中遇到的问题和解决方案整理整理。
闲言少叙(好像不少了☻)...
一、效果
所选课程列是多选,这里决定用弹出框的效果(popup)
![](https://images2015.cnblogs.com/blog/361896/201511/361896-20151115170230087-896754302.png)
二、准备工作
为了方便,这里用Jfinal搭了个简单的环境,导入ligerUI的js和css就可以了。
![](https://images2015.cnblogs.com/blog/361896/201511/361896-20151115170230478-1128210322.png)
在JSP用引入下面几个文件,为了方便调试,我这里引用的是ligerui.all.js,生产环境用ligerui.min.js就可以了
![](https://images2015.cnblogs.com/blog/361896/201511/361896-20151115170230822-965755441.png)
三、实战
-
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 <linktype="text/css"href="/ligerui/skins/Aqua/css/ligerui-all.css" 9 rel="stylesheet"> 10 <scripttype="text/javascript"src="/js/jquery-1.4.4.min.js"></script> 11 <scripttype="text/javascript"src="/ligerui/js/ligerui.all.js"></script> 12 <scripttype="text/javascript"> 13 //测试数据 14 var test_data ={ 15 Rows:[{ 16 user_num :'A0001', 17 user_name :'张三' 18 },{ 19 user_num :'A0002', 20 user_name :'李四' 21 },{ 22 user_num :'A0003', 23 user_name :'王五' 24 }], 25 Total:3 26 }; 27 //课程数据 28 var courser_data ={ 29 Rows:[{ 30 courser_id :'B001', 31 courser_name :'语文' 32 },{ 33 courser_id :'B002', 34 courser_name :'数学' 35 },{ 36 courser_id :'B003', 37 courser_name :'英语' 38 },{ 39 courser_id :'B004', 40 courser_name :'音乐' 41 },{ 42 courser_id :'B005', 43 courser_name :'体育' 44 },{ 45 courser_id :'B006', 46 courser_name :'美术' 47 }], 48 Total:6 49 }; 50 $(function(){ 51 initGrid(); 52 }) 53 function initGrid(){ 54 $("#grid_first").ligerGrid({ 55 columns :[{ 56 display :'姓名', 57 name :'user_name', 58 width :120 59 },{ 60 display :'学号', 61 name :'user_num', 62 width :120 63 },{ 64 display :'所选课程', 65 name :'course_id', 66 textField :'course_name', 67 width :240, 68 editor :{ 69 type :'popup', 70 valueField :'courser_id', 71 textField :'courser_name', 72 grid :{ 73 columns :[{ 74 display :'课程名称', 75 name :'courser_name' 76 }], 77 width :360,//指定弹出框宽度 78 enabledSort :false, 79 data : $.extend({}, courser_data), 80 checkbox :true, 81 usePager :false, 82 rownumbers :false 83 } 84 } 85 }], 86 enabledEdit :true, 87 usePager :false, 88 checkbox :false, 89 width :'100%', 90 heigth :'99', 91 enabledSort :false, 92 data : test_data 93 }); 94 } 95 </script> 96 </head> 97 <body> 98 <divid="grid_first"></div> 99 </body> 100 </html>
上面的代码是根据官网的例子写的,但是这样运行是有问题的:1.重新选择时取消选择不生效;2.设置宽度不生效。这是本篇主要介绍的内容。
1.解决重新选择时取消选择不生效的问题:
当取消选择"数学"时,结果并不会生效。
![](https://images2015.cnblogs.com/blog/361896/201511/361896-20151115170231775-1840511246.png)
调试时会发现,选择的数据居然有7个,当然这里面有重复的,三个是第二次选择的三个项,另外四个则是前一次选择的四个项,所以回写时就覆盖掉了取消选择。
![](https://images2015.cnblogs.com/blog/361896/201511/361896-20151115170232650-360448246.png)
继续调试跟踪,初始选择时,居然会运行12次,也就是初始化了两遍,原因应该就在这了。
![](https://images2015.cnblogs.com/blog/361896/201511/361896-20151115170233369-441062648.png)
追踪到调用位置,如果frozen=true时,_fillGridBody()会执行两遍。
![](https://images2015.cnblogs.com/blog/361896/201511/361896-20151115170234337-799654858.png)
解决:
修改一下代码,在editor中增加frozen:false就可以了
-
1 editor : { 2 type : 'popup', 3 valueField : 'courser_id', 4 textField : 'courser_name', 5 grid : { 6 columns : [{ 7 display : '课程名称', 8 name : 'courser_name' 9 } 10 ], 11 width : 360, //指定弹出框宽度 12 enabledSort : false, 13 data : $.extend({}, courser_data), 14 checkbox : true, 15 usePager : false, 16 rownumbers : false, 17 frozen : false 18 }
2.解决指定宽度不生效的问题
找到源码ligerui.all.js第16546行,可以看到这里并未获取参数中传过来的width,height属性值,为了使用方便只好修改一下源代码,指定grid的width和height即为Dialog的宽和高。
-
1 if(!g.popupFn){ 2 var options ={ 3 grid : gridOptions, 4 condition : p.condition, 5 valueField : p.valueField, 6 textField : p.textField, 7 split : p.split, 8 lastSelected : getLastSelected(), 9 onSelect :function(e){ 10 if(g.trigger('select', e)==false) 11 return; 12 if(p.grid.checkbox){ 13 g.addValue(e.value, e.text); 14 g.removeValue(e.remvoeValue, e.remvoeText); 15 }else{ 16 g.setValue(e.value); 17 g.setText(e.text); 18 } 19 g.trigger('selected', e); 20 }, 21 selectInit :function(rowdata){ 22 var value = g.getValue(); 23 if(!value) 24 returnfalse; 25 if(!p.valueField ||!rowdata[p.valueField]) 26 returnfalse; 27 return $.inArray(rowdata[p.valueField].toString(), value.split(p.split))!=-1; 28 } 29 }; 30 //modify by Rhys Lee 用于支持设置弹出框高度和宽度 31 if(gridOptions.width){ 32 options.width = gridOptions.width; 33 } 34 if(gridOptions.height){ 35 options.height = gridOptions.height; 36 } 37 //modify end 38 g.popupFn = $.ligerui.getPopupFn(options); 39 }
第一次写博客,肯定有不好的地方,希望大家指正。(请轻拍)