投放本站广告请联系:
extjscn#126.com
ExtJS 3升级到ExtJS 4
前言
若干年前,使用ExtJS 3 开发了一个系统。
随着ExtJS 4的出现,总是会看到或听到关于Ext 比较多的言论是 :
ExtJS 4 较Ex JS 3 有较大的改变。
ExtJS 4不向下兼容。
ExtJS 4 开始收费了。
基于这些,对ExtJS 4一直就望而却步。也曾转向使用dojo.
但是对ExtJS 4 的新的平板风格和一些性能上的考量之后,还是决定使用ExtJS 4.
在升级结束之际,总结一些主要的改变和应对之策。
创建组件方法
1.
new
Ext.XXX ==> Ext.create(
""
,{})
在ExtJS 4之前,创建一个组件的方法是:
1.
var
win =
new
Ext.Window({
2.
//some options
3.
});
在Ext JS 4中, 创建一个组件的方法改变了。 使用Ext.create 的方式。
1.
var
win = Ext.create(
"Ext.window.Window"
,{
2.
//some options
3.
});
这中改变,其实是Ext JS 4 改进的一个亮点, 就是支持动态加载了。
在使用旧的方式的时候,相应组件定义的js 文件必须被先include 进来(旧的版本全部包在ext-all.js中), 在新版中可以只导入一些核心的类,其他需要的类使用require 的方式动态导入, 好处就是提高了性能。
当然,在新版中也是支持旧的创建方式的。所以对于升级这件事来说,如果不考虑或者这种类型不考虑动态加载的话, 可以不做更改。
数据模型改变
1.
Ext.data.Record ==> Ext.data.Model
这个已经完全替换了, 就的方式已经不能work了,必须更改
直接看两个例子就清楚了:
ExtJS 3 的方式:
01.
<!-- add by oscar999 -->
02.
<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
03.
<html>
04.
<head>
05.
<meta http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
>
06.
<title>Insert title here</title>
07.
<script type=
"text/javascript"
src=
"../adapter/ext/ext-base.js"
></script>
08.
<script type=
"text/javascript"
src=
"../ext-all.js"
></script>
09.
<link rel=
"stylesheet"
type=
"text/css"
href=
"../resources/css/ext-all.css"
/>
10.
11.
<script>
12.
Ext.onReady(
function
(){
13.
var
persons = [{
14.
name:
'Liu Bei'
,
15.
rank:
'Marshal'
16.
}, {
17.
name:
'Zhang Fei'
,
18.
rank:
'Admiral'
19.
}, {
20.
name:
'Guan Yu'
,
21.
rank:
'Admiral'
22.
}, {
23.
name:
'Zhao zilong'
,
24.
rank:
'Admiral'
25.
}];
26.
27.
var
personRecord = Ext.data.Record.create([{
28.
name:
'name'
29.
}, {
30.
name:
'rank'
31.
}]);
32.
var
personStore =
new
Ext.data.Store({
33.
data: persons,
34.
reader:
new
Ext.data.JsonReader({
35.
id:
'personXX'
36.
}, personRecord)
37.
});
38.
39.
var
personGrid =
new
Ext.grid.GridPanel({
40.
title:
'Three Kingdom'
,
41.
region:
'center'
,
42.
margins:
'0 5 5 0'
,
43.
height: 400,
44.
columns: [{
45.
dataIndex:
'name'
,
46.
header:
'Name'
,
47.
width: 200
48.
}, {
49.
dataIndex:
'rank'
,
50.
header:
'Rank'
,
51.
width: 300
52.
}],
53.
store: personStore,
54.
renderTo: Ext.getBody()
55.
});
56.
});
57.
</script>
58.
59.
</head>
60.
<body>
61.
62.
</body>
63.
</html>
ExtJS 4的写法
01.
<!-- add by oscar999 -->
02.
<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
03.
<html>
04.
<head>
05.
<meta http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
>
06.
<title>Insert title here</title>
07.
<script type=
"text/javascript"
src=
"../ext-all.js"
></script>
08.
<link rel=
"stylesheet"
type=
"text/css"
href=
"../resources/css/ext-all.css"
/>
09.
10.
<script>
11.
Ext.onReady(
function
(){
12.
var
persons = [{
13.
name:
'Liu Bei'
,
14.
rank:
'Marshal'
15.
}, {
16.
name:
'Zhang Fei'
,
17.
rank:
'Admiral'
18.
}, {
19.
name:
'Guan Yu'
,
20.
rank:
'Admiral'
21.
}, {
22.
name:
'Zhao zilong'
,
23.
rank:
'Admiral'
24.
}];
25.
26.
var
personModel = Ext.define(
'Person'
,
27.
{
28.
extend:
'Ext.data.Model'
,
29.
fields: [{name:
'name'
, type:
'string'
},{name:
'rank'
, type:
'string'
}]
30.
});
31.
var
personStore = Ext.create(
'Ext.data.Store'
,{
32.
model:
'Person'
,
33.
data: persons
34.
});
35.
36.
var
personGrid =
new
Ext.grid.GridPanel({
37.
title:
'Three Kingdom'
,
38.
region:
'center'
,
39.
margins:
'0 5 5 0'
,
40.
height: 400,
41.
columns: [{
42.
dataIndex:
'name'
,
43.
header:
'Name'
,
44.
width: 200
45.
}, {
46.
dataIndex:
'rank'
,
47.
header:
'Rank'
,
48.
width: 300
49.
}],
50.
store: personStore,
51.
renderTo: Ext.getBody()
52.
});
53.
});
54.
</script>
55.
56.
</head>
57.
<body>
58.
59.
</body>
60.
</html>
注意,为了更清楚的比较,这里只仅仅是让模型和store 的写法不一致(Grid 的定义也要使用Ext.create的方式)。
这里还可以看到一个区别就是ExtJS 4不需要额外导入 ext-base.js
新类型定义
1.
Ext.reg ==> Ext.define
从Ext.reg 转到Ext.define来创建组件类, 一个好处也是可以实现动态加载JS 类。
而且新的方式会自动完成命名空间的创建(namespace).
旧的方式:
1.
Ext.ns(
"Foo.bar"
);
2.
3.
Foo.bar = Ext.extend(Ext.util.Observable,{
4.
//your code here
5.
});
6.
Ext.reg(
"foobar"
,Foo.bar);
新的方式:
1.
Ext.define(
"Foo.bar"
,{
2.
extend :
"xxxxxx"
,
3.
alias :
"widget.foobar"
4.
//your code here
5.
});
不难理解,为什么可以实现动态记载。一个创建需要的是一个js 对象,而另外一个只是一个string.
Store定义的变化
(跨域参数传递)旧的方式:
1.
var
store =
new
Ext.data.Store({
2.
proxy:
new
Ext.data.ScriptTagProxy({
3.
url:
'http://extjs.com/forum/topics-remote.php'
4.
}),
5.
......
6.
baseParams: {limit:20, forumId: 4}
7.
});
新的方式:
1.
var
store = Ext.create(
'Ext.data.Store'
, {
2.
model:
'User'
,
3.
proxy: {
4.
type:
'jsonp'
,
5.
url :
'http://extjs.com/forum/topics-remote.php'
,
6.
extraParams: {limit:20, forumId: 4}
7.
}
8.
});
上面介绍的 ”数据模型改变(Ext.data.Record ==> Ext.data.Model) “也是store reader 的定义的变化。
除此之外,上面的例子还有三个不一样的地方:
1. new Ext.XXX ==> Ext.create, 这个上面也介绍到了
2. 跨域取数据的store 定义 (不兼容,需要更新)
旧的方式使用new Ext.data.ScriptTagProxy,新的方式只需要指定proxy的type 为 jsonp 就可以了
3. 参数传递(不兼容,需要更新)
旧的方式是在store 下配置baseParams, 新的方式需要到proxy 下配置extraParams.
applyTo/renderTo 的改变
作者: oscar999
原谅: http://blog.csdn.net/oscar999/article/details/9453771
- 要发表评论,请先登录