ext-ui.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