【LigerUI实战】Grid弹出编辑popup

    最近为分公司的项目做外援,做起了全栈的活。被公司自研架构磨灭的几乎忘掉了其他技能,正好新项目决定重新搭个架构,与同事们讨论过后,决定Spring+MyBatis+SpringMVC+CXF+LigerUI。除了Spring比较熟悉外,其他的还是新接触,不过现在来看,MyBatis和SpringMVC还真是简单易学。不过我的前端知识很有限,干起活来还真是不顺手,所以决定把LigerUI中遇到的问题和解决方案整理整理。

    闲言少叙(好像不少了☻)...

一、效果

    所选课程列是多选,这里决定用弹出框的效果(popup)

【LigerUI实战】Grid弹出编辑popup_第1张图片

二、准备工作

    为了方便,这里用Jfinal搭了个简单的环境,导入ligerUI的js和css就可以了。

【LigerUI实战】Grid弹出编辑popup_第2张图片

    在JSP用引入下面几个文件,为了方便调试,我这里引用的是ligerui.all.js,生产环境用ligerui.min.js就可以了

三、实战

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link type="text/css" href="/ligerui/skins/Aqua/css/ligerui-all.css"
	rel="stylesheet">
<script type="text/javascript" src="/js/jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="/ligerui/js/ligerui.all.js"></script>
<script type="text/javascript">
	//测试数据
	var test_data = {
		Rows : [ {
			user_num : 'A0001',
			user_name : '张三'
		}, {
			user_num : 'A0002',
			user_name : '李四'
		}, {
			user_num : 'A0003',
			user_name : '王五'
		} ],
		Total : 3
	};
	//课程数据
	var courser_data = {
		Rows : [ {
			courser_id : 'B001',
			courser_name : '语文'
		}, {
			courser_id : 'B002',
			courser_name : '数学'
		}, {
			courser_id : 'B003',
			courser_name : '英语'
		}, {
			courser_id : 'B004',
			courser_name : '音乐'
		}, {
			courser_id : 'B005',
			courser_name : '体育'
		}, {
			courser_id : 'B006',
			courser_name : '美术'
		} ],
		Total : 6
	};
	$(function() {
		initGrid();
	})
	function initGrid() {
		$("#grid_first").ligerGrid({
			columns : [ {
				display : '姓名',
				name : 'user_name',
				width : 120
			}, {
				display : '学号',
				name : 'user_num',
				width : 120
			}, {
				display : '所选课程',
				name : 'course_id',
				textField : 'course_name',
				width : 240,
				editor : {
					type : 'popup',
					valueField : 'courser_id',
					textField : 'courser_name',
					grid : {
						columns : [ {
							display : '课程名称',
							name : 'courser_name'
						} ],
						width : 360,//指定弹出框宽度
						enabledSort : false,
						data : $.extend({}, courser_data),
						checkbox : true,
						usePager : false,
						rownumbers : false
					}
				}
			} ],
			enabledEdit : true,
			usePager : false,
			checkbox : false,
			width : '100%',
			heigth : '99',
			enabledSort : false,
			data : test_data
		});
	}
</script>
</head>
<body>
	<div id="grid_first"></div>
</body>
</html>

上面的代码是根据官网的例子写的,但是这样运行是有问题的:1.重新选择时取消选择不生效;2.设置宽度不生效。这是本篇主要介绍的内容。

1.解决重新选择时取消选择不生效的问题:

    当取消选择"数学"时,结果并不会生效。

【LigerUI实战】Grid弹出编辑popup_第3张图片

    调试时会发现,选择的数据居然有7个,当然这里面有重复的,三个是第二次选择的三个项,另外四个则是前一次选择的四个项,所以回写时就覆盖掉了取消选择。

【LigerUI实战】Grid弹出编辑popup_第4张图片

    继续调试跟踪,初始选择时,居然会运行12次,也就是初始化了两遍,原因应该就在这了。

【LigerUI实战】Grid弹出编辑popup_第5张图片

    追踪到调用位置,如果frozen=true时,_fillGridBody()会执行两遍。

【LigerUI实战】Grid弹出编辑popup_第6张图片

    解决:

修改一下代码,在editor中增加frozen:false就可以了

  1. editor : {
    	type : 'popup',
    	valueField : 'courser_id',
    	textField : 'courser_name',
    	grid : {
    		columns : [{
    				display : '课程名称',
    				name : 'courser_name'
    			}
    		],
    		width : 360, //指定弹出框宽度
    		enabledSort : false,
    		data : $.extend({}, courser_data),
    		checkbox : true,
    		usePager : false,
    		rownumbers : false,
    		frozen : false
    	}
    }

     2.解决指定宽度不生效的问题

    找到源码ligerui.all.js第16546行,可以看到这里并未获取参数中传过来的width,height属性值,为了使用方便只好修改一下源代码,指定grid的width和height即为Dialog的宽和高。

  1. if (!g.popupFn) {
    	var options = {
    		grid : gridOptions,
    		condition : p.condition,
    		valueField : p.valueField,
    		textField : p.textField,
    		split : p.split,
    		lastSelected : getLastSelected(),
    		onSelect : function (e) {
    			if (g.trigger('select', e) == false)
    				return;
    			if (p.grid.checkbox) {
    				g.addValue(e.value, e.text);
    				g.removeValue(e.remvoeValue, e.remvoeText);
    			} else {
    				g.setValue(e.value);
    				g.setText(e.text);
    			}
    			g.trigger('selected', e);
    		},
    		selectInit : function (rowdata) {
    			var value = g.getValue();
    			if (!value)
    				return false;
    			if (!p.valueField || !rowdata[p.valueField])
    				return false;
    			return $.inArray(rowdata[p.valueField].toString(), value.split(p.split)) != -1;
    		}
    	};
    	//modify by Rhys Lee.用于支持设置弹出框高度和宽度
    	if (gridOptions.width) {
    		options.width = gridOptions.width;
    	}
    	if (gridOptions.height) {
    		options.height = gridOptions.height;
    	}
    	//modify end
    	g.popupFn = $.ligerui.getPopupFn(options);
    }

         第一次写博客,肯定有不好的地方,希望大家指正。(请轻拍)

 

 




你可能感兴趣的:(【LigerUI实战】Grid弹出编辑popup)