原文:http://www.sencha.com/blog/using-ext-loader-for-your-application/
ExtJS 4.0是一个使用新的依赖系统的类加载系统。这两个强大的新功能允许你创建大量允许浏览器按需下载脚本代码的应用。
今天,我们将通过建立一个小的使用新的类加载系统的应用程序来熟悉一下依赖管理系统。同时,我们将讨论Ext加载系统的各种配置项。
在开始之前,我们先来看看将要实现的结果。这样做,可使我们确定需要扩展那些类。
应用会包括互相绑定的GridPanel和FormPanel,名称分别为UserGridPanel和UserFormPanel。UserGridPanel的操作需要创建一个模型和Store。UserGridPanel和UserFormPanel将被渲染到一个名称为UserEditorWindow的窗口,它扩张自ExtJS的Window类。所有这些类都会在命名空间MyApp下。
在开始编码前,首先要确定目录结构,以下是使用命名空间组织的文件夹:
从上图可以看到,MyApp目录已经按照命名空间进拆分成几个目录。在完成开发的时候,我们的应用将会有一个如下图所示的内部依赖运行模型。
(尽管应用的目录构成很象ExtJS 4 MVC架构,事实上示例并没有使用它)
现在开始编写index.html文件,这里需要包含应用需要的启动文件和应用的根文件(app.js)。
1 | DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
2 | <html> |
3 | <head> |
4 | <title>Ext 4 Loader</title> |
5 | <link rel="stylesheet" type="text/css" href="js/ext-4.0.1/resources/css/ext-all.css" /> |
6 | |
7 | <script type="text/Javascript" src="js/MyApp/app.js"> |
8 | </head> |
9 | <body> |
10 | </body> |
11 | </html> |
index.html文件中需要使用link标记包含ExtJS 4的样式文件。包含ext-debug.js文件的Javascript标记可能要修改多次,ext-all-debug.js文件是开发调试用的,而ext-all.js则是在发布产品时使用的。
这里有几个选择,每个选择都有优缺点。
以下是这些文件的说明:
ext-all-debug-w-comments.js:带注释的的完整调试版本。文件比较大,加载时间比较长。
ext-all-debug.js : 不带注释的完整调试版本。文件也比较大,但很适合调试。
ext-all.js ;压缩后的完整版本,文件比较小。使用该版本调试很困难,因此一般在发布产品时才使用。
ext-debug.js : 该文件只包含ExtJS基础架构和空的结构。使用该文件,可以实现ExtJS类文件的远程加载,而且提供了很好的调试体验,不过代价是相当的慢。
ext.js : ext-debug.js的压缩版本。
我们的index.html将使用ext-debug.js文件,这是实现动态加载所需的最低要求。最后,我们将展示如何使用ext-all版本获取最好的结果。
由于UserGridPanel 类要求模型和Store,因而,要先定义编写这些支持类。现在开始编写模型和Store:
1 | Ext.define('MyApp.models.UserModel', { |
2 | extend : 'Ext.data.Model', |
3 | fields : [ |
4 | 'firstName', |
5 | 'lastName', |
6 | 'dob', |
7 | 'userName' |
8 | ] |
9 | }); |
以上代码扩展自Ext.data.Model,将创建UserModel 类。因为扩展自Ext.data.Model类,ExtJS会自动加载它,并在它加载后创建UserModel类。
下一步,要创建扩展自Ext.data.Store的UserStore 类:
1 | Ext.define('MyApp.stores.UserStore', { |
2 | extend : 'Ext.data.Store', |
3 | singleton : true, |
4 | requires : ['MyApp.models.UserModel'], |
5 | model : 'MyApp.models.UserModel', |
6 | constructor : function() { |
7 | this.callParent(arguments); |
8 | this.loadData([ |
9 | { |
10 | firstName : 'Louis', |
11 | lastName : 'Dobbs', |
12 | dob : '12/21/34', |
13 | userName : 'ldobbs' |
14 | }, |
15 | { |
16 | firstName : 'Sam', |
17 | lastName : 'Hart', |
18 | dob : '03/23/54', |
19 | userName : 'shart' |
20 | }, |
21 | { |
22 | firstName : 'Nancy', |
23 | lastName : 'Garcia', |
24 | dob : '01/18/24', |
25 | userName : 'ngarcia' |
26 | } |
27 | ]); |
28 | } |
29 | }); |
当创建单件模式的UserStore 时,需要在UserStore原型添加一个requires关键字,它会在类实例化前,为ExtJS提供一个类的请求列表。在这个示例,列表中只有UserModel 一个请求类。
(实际上,在Store的原型中定义了model为UserModel 类,ExtJS就会自动加载它。在requires关键字中列出的目的,是希望你的代码能自文档化(self-documenting),从而提醒你,UserModel 类是必须的)
好了,UserGridPanel视图需要的基类已经创建了,现在可以创建UserGridPanel类了:
1 | Ext.define('MyApp.views.UsersGridPanel', { |
2 | extend : 'Ext.grid.Panel', |
3 | alias : 'widget.UsersGridPanel', |
4 | requires : ['MyApp.stores.UserStore'], |
5 | initComponent : function() { |
6 | this.store = MyApp.stores.UserStore; |
7 | this.columns = this.buildColumns(); |
8 | this.callParent(); |
9 | }, |
10 | buildColumns : function() { |
11 | return [ |
12 | { |
13 | header : 'First Name', |
14 | dataIndex : 'firstName', |
15 | width : 70 |
16 | }, |
17 | { |
18 | header : 'Last Name', |
19 | dataIndex : 'lastName', |
20 | width : 70 |
21 | }, |
22 | { |
23 | header : 'DOB', |
24 | dataIndex : 'dob', |
25 | width : 70 |
26 | }, |
27 | { |
28 | header : 'Login', |
29 | dataIndex : 'userName', |
30 | width : 70 |
31 | } |
32 | ]; |
33 | } |
34 | }); |
在上面代码中,要注意requires 关键字,看它是怎么增加UserStore 为请求类的。刚才,我们为GridPanel扩展和Store扩展配置了一个直接的依赖关系。
下一步,我们要创建FormPanel扩展:
1 | Ext.define('MyApp.views.UserFormPanel', { |
2 | extend : 'Ext.form.Panel', |
3 | alias : 'widget.UserFormPanel', |
4 | bodyStyle : 'padding: 10px; background-color: #DCE5F0;' |
5 | + ' border-left: none;', |
6 | defaultType : 'textfield', |
7 | defaults : { |
8 | anchor : '-10', |
9 | labelWidth : 70 |
10 | }, |
11 | initComponent : function() { |
12 | this.items = this.buildItems(); |
13 | this.callParent(); |
14 | }, |
15 | buildItems : function() { |
16 | return [ |
17 | { |
18 | fieldLabel : 'First Name', |
19 | name : 'firstName' |
20 | }, |
21 | { |
22 | fieldLabel : 'Last Name', |
23 | name : 'lastName' |
24 | }, |
25 | { |
26 | fieldLabel : 'DOB', |
27 | name : 'dob' |
28 | }, |
29 | { |
30 | fieldLabel : 'User Name', |
31 | name : 'userName' |
32 | } |
33 | ]; |
34 | } |
35 | }); |
因为UserForm 不需要从服务器端请求任何类,因而不需要添加requires定义。
应用快完成了,现在需要创建UserEditorWindow类和运行应用的app.js。以下是UserEditorWindow类的代码。因为要将Grid和表单绑定在一起,因而类代码有点长,请见谅:
1 | Ext.define('MyApp.views.UserEditorWindow', { |
2 | extend : 'Ext.Window', |
3 | requires : ['MyApp.views.UsersGridPanel','MyApp.views.UserFormPanel'], |
4 | height : 200, |
5 | width : 550, |
6 | border : false, |
7 | layout : { |
8 | type : 'hbox', |
9 | align : 'stretch' |
10 | }, |
11 | initComponent : function() { |
12 | this.items = this.buildItems(); |
13 | this.buttons = this.buildButtons(); |
14 | this.callParent(); |
15 | this.on('afterrender', this.onAfterRenderLoadForm, this); |
16 | }, |
17 | buildItems : function() { |
18 | return [ |
19 | { |
20 | xtype : 'UsersGridPanel', |
21 | width : 280, |
22 | itemId : 'userGrid', |
23 | listeners : { |
24 |
写下你的评论吧 !
推荐阅读
|