现在的位置: 首页 > 综合 > 正文

Extjs嵌套数据类型定义和显示 (二)

2013年12月11日 ⁄ 综合 ⁄ 共 4545字 ⁄ 字号 评论关闭

在前一篇文章中,讲解了嵌套数据的模型定义,本篇文章主要讲解怎样在Ext.grid.Panel中显示嵌套的数据。

需求描述:

在Ext.grid.Panel中把定义的Project显示出来,项目成员显示在一列中。

因此需要稍微修改Model的定义,增加一个虚拟列:allMembers

/**
		 * 项目model定义
		 */
		Ext.define('Project', {
			extend : 'Ext.data.Model',
			fields : [ {
				name : 'projectId', //项目id
				type : 'string'
			}, {
				name : 'projectName', //项目名称
				type : 'string'
			}, {
				name : 'projectManager', //项目主管
				type : 'string'
			}, {
				name : 'allMembers', //项目成员列表
				type : 'string',
				convert : function(value, record) {
					var members = record.raw.memberList;
					var tempList = "";
					Ext.Array.forEach(members, function(item, index, allItems) {
						tempList += (item.memberName + " ");
					});
					return tempList;
				}
			}],
			hasMany : {
				model : 'ProjectMember',
				name : 'members'                //访问member的方法
				associationKey : 'memberList'     //读取数据的property
			}
		});

虚拟列中使用 convert属性,定义需要显示的内容,把member成员拼接成一个字符串,以便在Ext.grid.Panel中显示。

注: record最好使用 record.raw.members的数据。

加上显示面板:

//项目列表
		var projectPanel = Ext.create('Ext.grid.Panel', {
			store : projectStore,
			width : document.body.clientWidth * 0.98,
			padding : '8 0 0 0',
			collapsible : true,
			renderTo : Ext.getBody(),
			title : '项目列表',
			stateful : true,
			stripeRows : true,
			columnLines : true,
			selModel : Ext.create('Ext.selection.CheckboxModel', {
				mode : 'SINGLE'
			}),
			columns : [ {
				text : '项目名称',
				dataIndex : 'projectName',
				sortable : true,
				align : 'center',
				flex : 1
			}, {
				text : '项目主管',
				dataIndex : 'projectManager',
				sortable : true,
				align : 'center',
				flex : 1
			}, {
				text : '项目成员',
				dataIndex : 'allMembers',
				sortable : true,
				align : 'center',
				flex : 1
			} ],
			bbar : Ext.create('Ext.PagingToolbar', {
				store : projectStore,
				autoScroll : true,
				displayInfo : true,
				displayMsg : '当前显示 {0} - {1}  共{2}',
				emptyMsg : "没有记录"
			}),
			listeners : {
				selectionchange : function(model, records) {

				}
			}
		});
		
	});

完整的可执行代码:modelDisplay.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>显示嵌套Model数据</title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<link rel="stylesheet" type="text/css"	href="extjs/resources/css/ext-all.css" />
<script type="text/javascript" src="extjs/ext-all.js"></script>
<script type="text/javascript">
	Ext.onReady(function() {

		/**
		 * 项目成员model定义
		 */
		Ext.define('ProjectMember', {
			extend : 'Ext.data.Model',
			fields : [ {
				name : 'memberId', //项目成员Id
				type : 'string'
			}, {
				name : 'memberName', //项目成员姓名
				type : 'string'
			}, {
				name : 'projectId', //项目id
				type : 'string'
			} ],
			belongsTo : {
				model : 'Project',
				primaryKey : 'memberId',
				foreignKey : 'projectId'
			}
		});

		/**
		 * 项目model定义
		 */
		Ext.define('Project', {
			extend : 'Ext.data.Model',
			fields : [ {
				name : 'projectId', //项目id
				type : 'string'
			}, {
				name : 'projectName', //项目名称
				type : 'string'
			}, {
				name : 'projectManager', //项目主管
				type : 'string'
			}, {
				name : 'allMembers', //项目成员列表
				type : 'string',
				convert : function(value, record) {
					var members = record.raw.memberList;
					var tempList = "";
					Ext.Array.forEach(members, function(item, index, allItems) {
						tempList += (item.memberName + " ");
					});
					return tempList;
				}
			}],
			hasMany : {
				model : 'ProjectMember',
				name : 'members' //访问member的方法
				associationKey : 'memberList' //读取数据的property
			}
		});

		var testData = {
			"projects" : [ {
				"projectId" : "1",
				"projectName" : "内存项目-1",
				"projectManager" : "刘志远",
				"memberList" : [ {
					"memberId" : "FANGHJ",
					"memberName" : "方浩江",
					"projectId" : "1"
				}, {
					"memberId" : "ZHAOKUN",
					"memberName" : "赵琨",
					"projectId" : "1"
				} ]
			}, {
				"projectId" : "2",
				"projectName" : "内存项目-2",
				"projectManager" : "刘志远",
				"memberList" : [ {
					"memberId" : "LIUFENG",
					"memberName" : "刘凤",
					"projectId" : "2"
				}, {
					"memberId" : "ZHAOKUN",
					"memberName" : "赵琨",
					"projectId" : "2"
				} ]
			}, {
				"projectId" : "3",
				"projectName" : "内存项目-3",
				"projectManager" : "刘志远",
				"memberList" : [ {
					"memberId" : "FANGHJ",
					"memberName" : "方浩江",
					"projectId" : "3"
				}, {
					"memberId" : "ZHAOKUN",
					"memberName" : "赵琨",
					"projectId" : "3"
				}, {
					"memberId" : "CUILT",
					"memberName" : "崔凌涛",
					"projectId" : "3"
				} ]
			} ],
			"totalCount" : 3
		};

		var projectStore = Ext.create('Ext.data.Store', {
			model : 'Project',
			pageSize : 10,
			proxy : {
				type : 'memory',
				data : testData,
				reader : {
					type : 'json',
					root : 'projects',
					totalProperty : 'totalCount'
				}
			}
		});
	
		projectStore.load();	

		//项目列表
		var projectPanel = Ext.create('Ext.grid.Panel', {
			store : projectStore,
			width : document.body.clientWidth * 0.98,
			padding : '8 0 0 0',
			collapsible : true,
			renderTo : Ext.getBody(),
			title : '项目列表',
			stateful : true,
			stripeRows : true,
			columnLines : true,
			selModel : Ext.create('Ext.selection.CheckboxModel', {
				mode : 'SINGLE'
			}),
			columns : [ {
				text : '项目名称',
				dataIndex : 'projectName',
				sortable : true,
				align : 'center',
				flex : 1
			}, {
				text : '项目主管',
				dataIndex : 'projectManager',
				sortable : true,
				align : 'center',
				flex : 1
			}, {
				text : '项目成员',
				dataIndex : 'allMembers',
				sortable : true,
				align : 'center',
				flex : 1
			} ],
			bbar : Ext.create('Ext.PagingToolbar', {
				store : projectStore,
				autoScroll : true,
				displayInfo : true,
				displayMsg : '当前显示 {0} - {1}  共{2}',
				emptyMsg : "没有记录"
			}),
			listeners : {
				selectionchange : function(model, records) {

				}
			}
		});
		
	});
</script>
</head>

<body>
</body>
</html>

注意: 加入对extjs包中的引用的那两个文件。

显示的效果图,如下:

总结: 当需要显示的数据和提供给模型的数据不一致的时候,简单的多个属性只显示一个的时候可以使用 Field定义是的mapping属性,若是显示的数据,需要多个属性拼接的时候,使用Field定义时的convert属性,自定义方法返回值。

抱歉!评论已关闭.