翻译Sencha Touch Architecture 第二章

Sencha Touch 开发的 应用

同样做为MVC结构,ExtJS和Touch有很多东西是一样的,总体的思路是相同的

在Sencha Touch 里,我们会处理到以下类

Ext.app.Application   这是应用程序类

Ext.app.Controller   这是控制器类

Ext.Container, Ext.Component  这些类及其子类用于提供 视图

Ext.data.Model    用于构造一个model, Ext.data.Store可以识别的

Ext.data.Store     这个类可以包含多个Ext.data.Model,即集合。用于展示列表。

文件夹结构

打到我们在第一章创建的SenchaArchitectureBook项目, 并创建一个touchapp目录

增加以下文件和目录

app   这是主程序目录。  其中包含model, view,controller, store 目录

data   这个目录放JSON 数据文件

sencha-touch-2.0.0   ExtJS 框架文件

app.js 这个应用的单点入口文件

index.html   应用的入口html文件

这是完成后的目录结构图

Model

我们将创建以下模型

User   

Department

User  在app\model\User.js 中输入以下代码

Ext.define('AM.model.User',{

  extend:'Ext.data.Model',

  config:{

    fields:['id','name','email','department']

  }

});

我们用以上代码定义 User模型

Department

在app\model\Department.js 中输入以下代码

Ext.define('AM.model.Department',{
  extend:'Ext.data.Model',
  config:{
    fields:['code','name','location']
  }
});

我们定义了Department 模型

Store

在这个应用中我们将有以下的集合

Users

Departments

Users

在app\store\Users.js中输入以下代码

 1 Ext.defind('AM.store.Users',{
 2     extend:'Ext.data.Store',
 3     config:{
 4         autoLoad:true,
 5         model:'AM.model.User',
 6         storeId:'Users',
 7         proxy:{
 8             type:'ajax',
 9             api:{
10                 read:'data/users.json'
11             },
12             reader:{
13                 type:'json',
14                 rootProperty:'users'
15             }
16         }
17     },
18     filterUsersByDepartment:function(deptCode) {
19         this.clearFilter();
20         this.filter([{
21             property:'department',
22             value:deptCode
23         }]);
24     },
25     refresh:function(){
26         this.clearFilter();
27     }
28 });

这个是user 模型的集合

Departments

 1 Ext.define('AM.store.Departments',{
 2     extend:'Ext.data.Store',
 3     model: 'AM.model.Department',
 4     config:{
 5         autoLoad:true,
 6         model:'AM.model.Department',
 7         storeId:'Departments',
 8         proxy:{
 9             type:'ajax',
10             api:{
11                 read:'data/departments.json'
12             },
13             reader:{
14                 type:'json',
15                 rootProperty:'departments'
16             }
17         }
18     }
19 });

包含Departments模型

View

这个应用有以下视图

User 列表

编辑User

Department 列表

User 列表

在/view/user/List.js输入以下代码

 1 Ext.define('AM.view.user.List' ,{
 2   extend: 'Ext.Container',
 3   alias : 'widget.userlist',
 4   config: {
 5     ui: 'light',
 6   layout: {
 7     type: 'fit'
 8   },
 9   items: [
10   {
11     xtype: 'toolbar',
12     docked: 'top',
13     title: 'All Users',
14     defaults: {
15       iconMask: true
16     },
17     items: [{
18       xtype: 'spacer'
19     },
20     {
21       iconCls: 'refresh',
22       ui: 'confirm',
23       handler: function(){
24       this.up('userlist').down('list').getStore().refresh();
25       this.up('toolbar').setTitle('All Users');
26   }
27 }]
28 },
29 {
30 xtype: 'list',
31 height: '100%',
32 ui: 'round',
33 itemTpl: [
34 '<div style="float:left;">{name}</div>',
35 '<div style="float:left;position:absolut
36 e;padding-left:150px;">{email}</div>'
37 ],
38 store: 'Users',
39 onItemDisclosure: true
40 }
41 ]
42 }
43 });

代码定义了User List 视图 ,是通过扩展Container类。

它展示了users 列表,并使用了disclosure 选项(查看更多说明,请看Sencha Touch API文档  Ext.dataview.List)和一个有标题和刷新按钮的导航栏。 列表使用Users集合来加载数据  类似于ExtJS-开发的应用, 刷新按钮的动作是作为本视图的逻辑放在view里做的

userlist 将以xtype来标这个视图

User Edit

在app\view\user\Edit.js里输入以下代码

 1 Ext.define('AM.view.user.Edit',{
 2     extend:'Ext.form.Panel',
 3     alias:'widget.useredit',
 4     config:{
 5         ui:'light',
 6         items:[
 7             {
 8                 xtype:'titlebar',
 9                 docked:'top',
10                 title:'Edit User'
11             },
12             {
13                 xtype:'textfield',
14                 label:'Name',
15                 name:'name',
16                 labelWidth:'50%',
17                 required:true
18             },
19             {
20                 xtype:'textfield',
21                 label:'Email',
22                 name:'emial',
23                 labelWidth:'50%',
24                 required:true
25             },
26             {
27                 xtype:'toolbar',
28                 docked:'bottom',
29                 items:[{
30                     xtype:'button',
31                     margin:10,
32                     align:'left',
33                     ui:'confirm',
34                     action:'save',
35                     text:'Save'
36                 },
37                 {
38                     xtype:'spacer'
39                 },
40                 {
41                     xtype:'button',
42                     margin:10,
43                     align:'right',
44                     ui:'decline',
45                     action:'cancel',
46                     text:'Cancel'
47                 }
48                 ]
49             }
50         ]
51     }
52 });

通过扩展form panel 我们定义了Edit User视图

它包含两个text 元素和一个包含保存和退出按钮的底部工具栏 

useredit alias 将作为xtype在视图中使用

Department List 

在app\view\department\List.js文件里输入以下代码

 1 Ext.define('AM.view.department.List',{
 2     extend:'Ext.Container',
 3     alias:'widget.departmentlist',
 4     config:{
 5         ui:'light',
 6         layout:{
 7             type:'fit'
 8         }
 9         items:[
10             {
11                 xtype:'titlebar',
12                 docked:'top',
13                 title:'Departments'
14             },
15             {
16                 xtype:'list',
17                 height:'100%',
18                 ui:'round',
19                 itemTpl:[
20                     '<div style="float:left;">{name}</div>',
21                     '<div style="float:left;position:absolute;padding-left:150px;">{location}</div>'
22                 ],
23                 store:'Departments',
24                 onItemDisclosure:false
25             }
26         ]
27     }
28 });

Department List 视图  扩展了Container 类,  它没有使用disclosure 选项来展示departments列表

列表使用Departments 集合来加载数据。

Controller   控制器

在这个应用程序中,我们有以下控制器

Users

Departments

Users  在app\controller\User.js 文件中输入以下代码

 1 Ext.define('AM.controller.Users',{
 2     extend:'Ext.app.Controller',
 3     config:{
 4         stores:['Users'],
 5         models:['User'],
 6         views:['user.Edit','user.List'],
 7         refs:{
 8             usersPanel:'userlist'
 9         }
10     },
11     init:function(app) {
12         this.control({
13             'userlist list':{
14                 disclose:thid.editUser
15             },
16             'useredit button[action=save]':{
17                 tap:this.updateUser    
18             },
19             'useredit button[action=cancel]':{
20                 tap:this.cancelEditUser    
21             }
22         })
23 
24         app.on('departmentSelected', function(app,model){
25             this.getUsersStore().filterUsersByDepartment(model.get('code'));
26             this.getUsersPanel().down('toolbar').setTitle(model.get('name') + ' Users';
27                 
28             )
29         },this);
30     },
31 
32     editUser: function(view, model, t,index,e,eOpts) {
33         var edit = Ext.create('AM.view.user.Edit');
34         Ext.Viewport.add(edit);
35         edit.setRecord(model);
36         Ext.Viewport.setActiveItem(edit);
37     } ,
38     updateUser:function(button,e,eOpts) {
39         var form = button.up('formpanel');
40         var record = form.getRecord(),
41             values = form.getValues();
42         record.set(values);
43         this.getUsersStore().sync();
44         Ext.Viewport.setActiveItem(0);
45 
46     },
47     cancelEditUser:function(button,e,eOpts) {
48         Ext.Viewport.setActiveItem(0);
49     }
50     ,
51     showUsersList:function(){
52         var list = Ext.create('AM.view.user.List');
53         Ext.Viewport.add(list);
54     },
55     getUsersStore:function() {
56         return this.getUsersPanel().down('list').getStore();
57     }
58 
59 
60 });

我们用以上代码来定义Users controller 

Departments

在app\controller\Departments.js 文件中输入以下代码

 1 Ext.define('AM.controller.Departments',{
 2     extend:'Ext.app.Controller',
 3     config:{
 4         stores:['Departments'],
 5         models:['Department'],
 6         views:['department.List']
 7     },
 8     init: function(){
 9         this.control({
10             'departmentlist list':{
11                 itemtap:this.showDepartmentUser
12             }
13         });    
14     },
15     showDepartmentUser:function(view,idx,t,model,e,eOpts) {
16         var app = this.initialConfig.application;
17         app.fireEvent('departmentselected',app,model);
18     }
19 })

以上代码定义了Departments 控制器

Application

在app.js文件中输入以下代码

 1 Ext.application({
 2     name:'AM',
 3     controllers:['Users','Departments'],
 4     launch:function(){
 5         var config={
 6             layout:'fit',
 7             items:[{
 8                 xtype:'departmentlist',
 9                 docked:'left',
10                 400
11             },{
12                 xtype:'userlist'    
13             }]
14         };
15         Ext.Viewport.add(config);
16     }
17 });

在最后一行, 我们新增加了面板, 将department list 和user list 加入到viewport里。

因为viewport概念对于触摸类设备来说不太直接, 框架使用了一些静态方法封装了这些区别,来供我们使用。例如add方法,让我们把内容加入到页面

原文地址:https://www.cnblogs.com/yushunwu/p/2842833.html