表格是一种常见的数据表现方式,ExtJS也提供了强大的表格显示工具。现在新建一个mygrid.html文件,并添加基本的HTML代码,如下:
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8; user-scalable=no">
<title>表格</title>
<link rel="stylesheet" type="text/css"href="resources/css/ext-all.css"/>
<scripttype="text/javascript" src="bootstrap.js"></script>
<script type="text/javascript"src="mygrid.js"></script>
</head>
<body>
<divid="myDataGrid" width="100%" height=500></div>
</body>
</html>
以上红色代码是需要在基本代码里面自己添加的。然后新建一个mugrid.js文件,这个js文件的代码如下:
Ext.require([ //添加需要引用的库
'Ext.grid.*',
'Ext.data.*',
'Ext.util.*',
'Ext.state.*'
]);
Ext.onReady(function(){
//1定义表格列数据模型,包括列名称、数据类型
Ext.define('myGridColumnModel', {
extend: 'Ext.data.Model',
fields: [
{name: 'Id',type:'int',convert: null,defaultValue: undefined},
{name: 'Name'}, //姓名为字符串
{name: 'Gender'},//性别也为字符串
{name: 'StudentNO',type: 'int', convert: null,defaultValue: undefined},//学号为int
{name: 'Height',type: 'float', convert: null, defaultValue: undefined},//高度为float
{name: 'Birthday', type: 'date',dateFormat: 'Yn/j h:ia',defaultValue: undefined}//生日为date
],
idProperty: 'Id'//ID属性
});
// 表格中显示的数据数组,与myGridColumnModel模型定义的列对应
var myData = [
[1, '张三', '男', 2012001, 170, '1985 9/1 12:00am'],
[2, '王五', '男', 2012002, 168, '1983 5/21 12:00am'],
[3, '王芳', '女', 2012003, 160, '1985 10/10 12:00am'],
[4, '李四', '男', 2012004, 172, '1984 7/13 12:00am'],
[5, '赵静', '女', 2012005, 155, '1985 5/1 12:00am'],
[6, '孙六', '男', 2012006, 165, '1985 3/21 12:00am'],
[7, '钱七', '男', 2012007, 170, '1984 12/12 12:00am']
];
//2 创建表格存储数据
var store = Ext.create('Ext.data.ArrayStore', {
model: 'myGridColumnModel', //表格模型
data: myData //数据
});
/**
*自定义显示该数据,在此用于表示如果性别是女性就显示红色
*@param{Object}val
*/
function showFemale(val) {
if (val == "女") {
return'<span style="color:red;">' + val + '</span>';
} elseif (val == "男"){
return'<span style="color:blue;">' + val + '</span>';
}
return val;
}
//3 创建表格
var grid = Ext.create('Ext.grid.Panel', {
store: store,
stateful: true,
collapsible: true,
multiSelect: true,
stateId: 'stateGrid',
columns: [
{
text : '编号', //表格列头显示的文字
width : 40,
sortable : true, //是否可以排序
dataIndex: 'Id' //来源于store中的哪一列,注意大小写
},
{
text : '姓名',
width : 60,
sortable : true,
dataIndex: 'Name'
},
{
text : '学号',
width : 60,
sortable : true,
dataIndex: 'StudentNO'
},
{
text : '性别',
width : 40,
sortable : true,
renderer : showFemale,
dataIndex: 'Gender'
},
{
text : '身高',
width : 40,
sortable : true,
dataIndex: 'Height'
},
{
text : '出生时间',
flex : 1,//弹性显示,如果宽度比较大时,该列宽度就为多余宽度
sortable : true,
renderer : Ext.util.Format.dateRenderer('m/d/Y'), //以月/日/年的形式显示时间
dataIndex: 'Birthday'
}
],
height: 300,
width: 400,
title: '表格',
renderTo: 'myDataGrid', //绘制到html中定义的div中
viewConfig: {
stripeRows: true,
enableTextSelection: true
}
});
});
这段代码比较长,总的来说分为三个部分:一、定义表格列数据模型myGridColumnModel,以前也叫ColumnModel,它主要是继承自Ext.data.Model,用于表示表格列的结构,包括列的名称、数据类型、格式等,在定义列数据模型之后再添加数据,本例中是myData变量,这个数组里面的结构应与myGridColumnModel中定义的列结构以及数据类型一致;二、创建表格存储数据store,意思就是根据前面定义的列数据模型myGridColumnModel以及定义的表格源数据myDate来创建一个用于表格grid显示的数据,类似于数据转换;三、创建表格grid(来源于Ext.grid.Panel),并设置其store为前面创建的表格存储数据,同时,在columns中定义显示的列数组,如:
{
text : '编号', //表格列头显示的文字
width : 40,
sortable : true, //是否可以排序
dataIndex: 'Id' //来源于store中的哪一列,注意大小写
}
text表示列标题,width表示列宽度,sortable表示是否可以排序(升序和降序),dataIndex这个属性表示该列来源于myGridColumnModel的哪一列,它的值应与myGridColumnModel中定义的字段名称一致,如myGridColumnModel中添加了name为Id的字段(field),那么在此也必须为Id,特别要注意大小写,否则可能无法正常显示该列数据。除了介绍的这些常用属性外,还有renderer属性用于表示该列的显示方式,例如显示时间就设置其为Ext.util.Format.dateRenderer('m/d/Y')。如果需要特殊处理,则可以通过定义函数来区别显示,举例说明,如果性别这一列要求男性显示为绿色,女性显示为红色,则可以自定义一个函数showFemale,如下:
/**
*自定义显示该数据,在此用于表示如果性别是女性就显示红色
*@param{Object}val
*/
function showFemale(val) {
if (val == "女") {
return'<span style="color:red;">' + val + '</span>';
} else {
return'<span style="color:blue;">' + val + '</span>';
}
return val;
}
如果这个值为“女”,就返回颜色为red,如果为“男”就返回颜色为blue。
flex属性用于指示该列是否为有弹性的列,主要是当表格宽度比较宽时,该列宽度就为表格多余的宽度,不至于出现还有多余空列。
保存mygrid.html和mygrid.js文件之后,浏览mygrid.html网页,其结果如下图所示:
注意到前面的代码中有两处出现了关于时间格式的设置,第一处为myGridColumnModel定义Birthday时,其dateFormat为'Y n/j h:ia',那么对应在定义数据myData的时候其时间输入格式也应该遵循该格式要求,如1985 9/1 12:00am。在此,Y表示以四位数字显示年份,如果是y则以2位数表示年份,n表示当月的月份(不补0),如果是m则也表示月份(但是要补0,如3月份应表示为03),j表示月份中天数(不补0),如果是d则也表示月份中的天数(但是要补0,即8号应表示为08),a表示用小写的am或pm表示上午还是下午,h表示用12小时制表示小时(不足位补0,如8点表示为08),i表示分钟数(不足位补0,如8分钟表示为08)。同样,在另外一处即表示中显示出生时间的格式Ext.util.Format.dateRenderer('m/d/Y'),它是以“月/日/年”的形式来显示。关于时间格式中各字符的含义如下表所示:
符号 | 含义 | 举例 |
d | 月份中的天数,两位数字,不足位补“0” | 10 |
D | 当前星期的缩写,三个字母 | Wed |
j | 月份中的天数,不补“0” | 10 |
l | 当前星期的完整拼写 | Wednesday |
S | 英语中月份天数的序数词的后缀,2个字符(与格式符“j”连用) | th |
w | 一周之中的天数(0~6)(周日为0, | 3 |
z | 一年之中的天数(0~365) | 9 |
W | 一年之中的周数,两位数字(00~53) | 1 |
F | 当前月份的拼写 | January |
m | 当前的月份,两位数字,不足位补“0” | 1 |
M | 当前月份的完整拼写,三个字母 | Jan |
n | 当前的月份,不补“0” | 1 |
t | 当前月份的总天数 | 31 |
L | 是否闰年(“1”为闰年,“0”为平年) | 0 |
Y | 4位数字表示的当前年数 | 2007 |
y | 2位数字表示的当前年数 | 7 |
a | 小写的“am”和“pm” | pm |
A | 大写的“AM”和“PM” | PM |
g | 12小时制表示的当前小时数,不补“0” | 3 |
G | 24小时制表示的当前小时数,不补“0” | 15 |
h | 12小时制表示的当前小时数,不足位补“0” | 3 |
H | 24小时制表示的当前小时数,不足位补“0” | 15 |
i | 不足位补“0”的分钟数 | 5 |
s | 不足位补“0”的秒数 | 1 |
u | 秒数的小数形式 | 0.1 |
O | 用小时数表示与GTM的差异数 | -600 |
T | 当前系统设定的时区 | CST |
Z | 用秒数表示的时区偏移量(西方为负数,东方为正数) | -21600 |
d | 月份中的天数,两位数字,不足位补“0” | 10 |
D | 当前星期的缩写,三个字母 | Wed |
j | 月份中的天数,不补“0” | 10 |
l | 当前星期的完整拼写 | Wednesday |
S | 英语中月份天数的序数词的后缀,2个字符(与格式符“j”连用) | th |
w | 一周之中的天数(0~6)(周日为0, | 3 |
z | 一年之中的天数(0~365) | 9 |
W | 一年之中的周数,两位数字(00~53) | 1 |
F | 当前月份的拼写 | January |
m | 当前的月份,两位数字,不足位补“0” | 1 |
M | 当前月份的完整拼写,三个字母 | Jan |
n | 当前的月份,不补“0” | 1 |
t | 当前月份的总天数 | 31 |
L | 是否闰年(“1”为闰年,“0”为平年) | 0 |
Y | 4位数字表示的当前年数 | 2007 |
y | 2位数字表示的当前年数 | 7 |
a | 小写的“am”和“pm” | pm |
A | 大写的“AM”和“PM” | PM |
g | 12小时制表示的当前小时数,不补“0” | 3 |
G | 24小时制表示的当前小时数,不补“0” | 15 |
h | 12小时制表示的当前小时数,不足位补“0” | 3 |
H | 24小时制表示的当前小时数,不足位补“0” | 15 |
i | 不足位补“0”的分钟数 | 5 |
s | 不足位补“0”的秒数 | 1 |
u | 秒数的小数形式 | 0.1 |
O | 用小时数表示与GTM的差异数 | -600 |
T | 当前系统设定的时区 | CST |
Z | 用秒数表示的时区偏移量(西方为负数,东方为正数) | -21600 |
格式中间的连接符号可以自己任意组合选择,如使用斜杠/或者短线-,甚至汉字,如格式“Y年n月j日 G:i:s”,其显示结果类似“2011年3月1日 8:00:30”。