sencha touch 有一套自己的类机制,可以以面向对象的方式去写代码,封装业务逻辑,sencha touch 的组件、插件、api等都建立在这一套类机制的上面

在实际开发中,我们需要遵循这一套机制,以免造成不必要的麻烦。

所以的类都是继承于Ext.Base

定义一个类的语法:Ext.define(className, properties);

其中className是类名,properties属于配置。

sencha touch开发推荐使用mvc结构,在这里我推荐以下结构

如图所示,我们一般在app文件夹中进行开发,其中config属于全局配置文件,是一个静态类

代码如下:

 1 //全局配置文件
 2 Ext.define('app.config', {
 3     //设置别名是为了方便调用,这样直接config.name就能获取到变量。
 4     alternateClassName: 'config',
 5     statics: {
 6         version: '1.0.0',
 7         used: {
 8             add: 'http://www.361y.cn:8080/Json/Used.asmx/Add',
 9             update: 'http://www.361y.cn:8080/Json/Used.asmx/Update',
10             destroy: 'http://www.361y.cn:8080/Json/Used.asmx/Delete',
11             list: 'http://www.361y.cn:8080/Json/Used.asmx/List',
12             one: 'http://www.361y.cn:8080/Json/Used.asmx/One'
13         }
14     }
15 });

如上所示,className的命名属于命名空间,此静态类的className是app.config,在这里表示app文件夹中的config.js文件。

为了方便调用,我们为他配置了alternateClassName属性。

我们在statics属性中配置全局变量,此类中我们只是配置了变量。

我们还可以在里面配置方法,不过为了方便维护,在另一个静态类中进行配置。

代码如下:

  1 //公用类
  2 Ext.define('app.util', {
  3     alternateClassName: 'util',
  4     statics: {
  5         //比较两个对象是否相等
  6         equals: function (x, y) {
  7             if (x === y) {
  8                 return true;
  9             }
 10             if (!(x instanceof Object) || !(y instanceof Object)) {
 11                 return false;
 12             }
 13             if (x.constructor !== y.constructor) {
 14                 return false;
 15             }
 16             for (var p in x) {
 17                 if (x.hasOwnProperty(p)) {
 18                     if (!y.hasOwnProperty(p)) {
 19                         return false;
 20                     }
 21                     if (x[p] === y[p]) {
 22                         continue;
 23                     }
 24                     if (typeof (x[p]) !== "object") {
 25                         return false;
 26                     }
 27                     if (!Object.equals(x[p], y[p])) {
 28                         return false;
 29                     }
 30                 }
 31             }
 32             for (p in y) {
 33                 if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) {
 34                     return false;
 35                 }
 36             }
 37             return true;
 38         },
 39         //重写ajax(需要初始化)
 40         overrideAjax: function () {
 41             var me = this;
 42             //开始加载
 43             Ext.Ajax.on('beforerequest',
 44             function (connection, options) {
 45                 if (!options.hidMessage) {
 46                     me.showMessage('正在努力加载中...');
 47                 }
 48             });
 49             //加载成功
 50             Ext.Ajax.on('requestcomplete',
 51             function (connection, options) {
 52                 me.hideMessage();
 53             });
 54             //加载失败
 55             Ext.Ajax.on('requestexception',
 56             function (connection, options) {
 57                 if (!options.hidMessage) {
 58                     me.showMessage('加载失败,请检查网络是否正常...', true);
 59                 }
 60             });
 61         },
 62         //重写list(需要初始化)
 63         overrideList: function () {
 64             //重写分页插件
 65             Ext.define("Ext.zh.plugin.ListPaging", {
 66                 override: "Ext.plugin.ListPaging",
 67                 config: {
 68                     //自动加载
 69                     autoPaging: true,
 70                     //滚动到最底部时是否自动加载下一页数据
 71                     noMoreRecordsText: '没有更多内容了',
 72                     loadMoreText: '加载更多...' //加载更多按钮显示内容
 73                 }
 74             });
 75             //重写下拉刷新
 76             Ext.define("Ext.zh.plugin.PullRefresh", {
 77                 override: "Ext.plugin.PullRefresh",
 78                 config: {
 79                     lastUpdatedText: '上次刷新时间:',
 80                     loadedText: '等一会再刷新吧...',
 81                     loadingText: '加载中...',
 82                     pullText: '下拉可以手动刷新',
 83                     releaseText: '松开可以刷新',
 84                     lastUpdatedDateFormat: 'Y-m-d H:i'
 85                 }
 86             });
 87             //重写List
 88             Ext.define("Ext.zh.List", {
 89                 override: "Ext.List",
 90                 config: {
 91                     //取消选择效果
 92                     selectedCls: '',
 93                     //禁用加载遮罩,防止跳转时页面卡顿,使用统一的遮罩效果
 94                     loadingText: false,
 95                     cls: 'list',
 96                     deferEmptyText: false,
 97                     emptyText: '没有更多内容了'
 98                 }
 99             });
100         },
101         //重写Pick相关(需要初始化)
102         overridePick: function () {
103             Ext.Date.monthNames = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"];
104             Ext.define("Ext.zh.DatePicker", {
105                 override: "Ext.picker.Date",
106                 config: {
107                     yearFrom: 2000,
108                     monthText: '月',
109                     dayText: '日',
110                     yearText: '年'
111                 }
112             });
113             Ext.define("Ext.local_zh_cn.Picker", {
114                 override: "Ext.picker.Picker",
115                 applyDoneButton: function (config) {
116                     if (config) {
117                         if (Ext.isBoolean(config)) {
118                             config = {};
119                         }
120                         if (typeof config == "string") {
121                             config = {
122                                 text: config
123                             };
124                         }
125                         Ext.applyIf(config, {
126                             ui: 'action',
127                             align: 'right',
128                             text: '确定'
129                         });
130                     }
131                     return Ext.factory(config, 'Ext.Button', this.getDoneButton());
132                 },
133                 applyCancelButton: function (config) {
134                     if (config) {
135                         if (Ext.isBoolean(config)) {
136                             config = {};
137                         }
138                         if (typeof config == "string") {
139                             config = {
140                                 text: config
141                             };
142                         }
143                         Ext.applyIf(config, {
144                             align: 'left',
145                             text: '取消'
146                         });
147                     }
148                     return Ext.factory(config, 'Ext.Button', this.getCancelButton());
149                 }
150
151             });
152         },
153         //app初始化执行
154         inIt: function () {
155             this.overrideList();
156             this.overrideAjax();
157             this.addMessage();
158             this.overridePick();
159         }
160     }
161 });

如此我们可以通过util.equals('a','b')调用指定方法,另外我们可以通过this来进行内部调用

以上两个类不会自动创建,我们必须创建之后才能调用。一般我们在app.js中进行创建

代码如下:

 1 Ext.application({
 2     name: 'app',
 3     requires: ['app.config','app.util', 'Ext.MessageBox'],
 4     controllers: ['Main', 'Used', 'User', 'Job'],
 5     launch: function () {
 6         // Destroy the #appLoadingIndicator element
 7         Ext.fly('appLoadingIndicator').destroy();
 8         util.inIt();
 9         // Initialize the main view
10         Ext.Viewport.add(Ext.create('app.view.Main'));
11     }
12 });

在此代码中我们通过requires进行了创建。

值得注意的是,全局变量,公共方法不止以上一种写法,你可以自行尝试一下其他写法。

下面来说一说普通类,例如一个视图。

代码如下:

 1 Ext.define('app.view.About', {
 2     alternateClassName: 'about',
 3     extend: 'Ext.Container',
 4     xtype: 'about',
 5     requires: ['ux.plugin.ConHref'],
 6     config: {
 7         title: '关于我们',
 8         margin: 10,
 9         plugins: 'conHref',
10         html: '<p>“抛砖网”国内首家首创纯实战型培训机构,提供在线培训、技术指导及答疑!</p><br/><p>团队通过360全方位技术培训+1度手把手技术指导,保证每一个学员能最快掌握实际工作技能;</p><br/><p>让每一个学员都能站在我们的肩膀上,展翅高飞。赶快关注“抛砖网”。</p><br/><p>网址:<a href="http://www.361y.cn">www.361y.cn</a></p><p>QQ群:263271569</p><p>官方微信号:paozhuanedu</p><br/><p><strong>本期课程说明及付费链接:</strong></p><p><a href="http://item.taobao.com/item.htm?id=36768998716">item.taobao.com/item.htm?id=36768998716</a></p>'
11     }
12 });

这是一个视图类,所在路径为app/view/About.js

在这里设置alternateClassName是为了方便创建,我们可以通过Ext.create('about')来创建类,等同于Ext.create('app.view.About')

extend属性表示他继承于Ext.Container这个类。

xtype是为了方便在控制层中进行监听,通常此属性是必须的。

requires表示这个类所依赖的类,在这里是指一个插件。通过config.plugins来使用

config表示此类中的各种配置,框架自动帮每一个配置项添加了以下方法:

getter方法 - 如getName就是返回name的当前值。

setter方法 - 如getName就是为name设置一个新值。

getter和setter都是自动生成的,建议大家使用它们来存取类里面的数据。ST的每一个组件都使用了getter和setter的模式,这意味着如果我们知道一个配置项,也就知道如何获取和设置它的值了。

这也让你的的代码更整洁。

如果你需要在视图创建时就添加一个按钮,并且能够动态更新。

可以如下:

 1 /**
 2 * 基于Ext.navigation.Bar
 3 * 去除动画切换等功能
 4 * 可以灵活的在NavigationView子项中配置属性
 5 * 小写开头表示这是私有控件,不能直接使用
 6 */
 7 Ext.define('ux.navigationBar', {
 8     extend: 'Ext.TitleBar',
 9     requires: [
10         'Ext.Button',
11         'Ext.Spacer'
12     ],
13     config: {
14         /*导航栏标题*/
15         title: null,
16         /*item默认类型*/
17         defaultType: 'button',
18         layout: {
19             type: 'hbox'
20         },
21         /*返回按钮*/
22         backButton: {
23             align: 'left',
24             ui: 'back',
25             hidden: true
26         }
27     },
28     /*初始化配置*/
29     constructor: function (config) {
30         config = config || {};
31         if (!config.items) {
32             config.items = [];
33         }
34         this.callParent([config]);
35     },
36     /*创建返回按钮*/
37     applyBackButton: function (config) {
38         return Ext.factory(config, Ext.Button, this.getBackButton());
39     },
40     /*更新返回按钮*/
41     updateBackButton: function (newBackButton, oldBackButton) {
42         if (oldBackButton) {
43             this.remove(oldBackButton);
44         }
45         if (newBackButton) {
46             this.add(newBackButton);
47
48             newBackButton.on({
49                 scope: this,
50                 tap: this.onBackButtonTap
51             });
52         }
53     },
54     /*点击返回按钮时触发*/
55     onBackButtonTap: function () {
56         this.fireEvent('back', this);
57     }
58 });

如上,applyBackButton方法在视图创建时会自动调用,只有返回的值部位false,并且不等于旧的值,就会自动触发updateBackButton方法,我们可以在里面进行逻辑处理。

另外一个类还值得主要的属性有:

alias :类似于alternateClassName,但是它的值只能是string数组

inheritableStatics:可继承的静态方法列表

mixins :额外需要继承的类

platformConfig:特殊平台或者主题中的默认配置

singleton:是否单例模式

uses :不一定依赖的类

sencha touch 类的使用相关推荐

  1. sencha touch 入门系列 (七)sencha touch 类系统讲解(上)

    在mvc结构的基础上,sencha touch又使用了sencha公司为extjs4开发出来的类系统,在面向对象的编程语言中,类是对对象的定义,它描述了对象所包含的大量属性和方法. 跟面向对象语言类似 ...

  2. 【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之三

    原文:Getting Started with Sencha Touch 2: Build a Weather Utility App (Part 3) 作者:Lee Boonstra Lee is ...

  3. 慢牛股票-基于Sencha touch+Cordova的股票类APP

    13,14这两年,我的业余时间都花在了移动互联网技术和股票技术分析上,14年底,终于开发完成慢牛,上线小米应用商店.应用宝.百度应用商店. 慢牛是一款数据分析类的股票APP,提供数据订阅和数据分析,帮 ...

  4. sencha touch下,害人不浅的“*”号命名空间引入

    最近各种语言混用着开发程序,今天集成时被sencha touch害得不浅,且听俺缓缓道来: 平时开发时都是在windows下装个chrome或者safari来调试sencha touch写的平板应用程 ...

  5. 【翻译】在Ext JS和Sencha Touch中创建自己定义布局

    原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...

  6. 【翻译】在Sencha Touch中创建离线/在线代理

    原文:Creating an Online/Offline proxy in Sencha Touch 概述 在Sencha Touch中,一个常见的需求就是,当设备在没有连接互联网的时候,应用程序必 ...

  7. 【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之二

    原文地址:http://www.sencha.com/blog/getting-started-with-sencha-touch-2-build-a-weather-utility-app-part ...

  8. 从零开始学习Sencha Touch MVC应用之十四

    我们已经给search-panel设置了cls属性:"一个可以添加到这个组件元素中的供选择的附加CSS类(默认为""),主要可用于对组件的定制风格或者其组件元素的CSS规 ...

  9. 使用phoneGap和Sencha Touch 2开发Android应用程序(四)

    2019独角兽企业重金招聘Python工程师标准>>> 本文是" 使用phoneGap和Sencha Touch 2开发Android应用程序"系列教程的第4章, ...

最新文章

  1. 纽约州金融服务局(NYDFS)为比特币现金(BCH)打开绿灯
  2. Oracle导出表(即DMP文件)的两种方法
  3. 总结redis中对象的类型与编码
  4. 清华大学:全面如期开课,履行社会责任!
  5. 【MySQL】基于MySQL的SQL核心语法实战演练(一)
  6. Sequential Recommender Systems
  7. 【软件测试】白盒测试与黑盒测试的区别(不同)
  8. tkinter label_tkinter版自制王者荣耀抽卡程序
  9. c# 汉语拼音排序函数
  10. 数据结构教程(c语言)(已完结)
  11. ARM 汇编指令 DCD
  12. 15-责任链模式Quarkus实现
  13. 刘润商业洞察力学习笔记1
  14. 小酌重构系列[10]——分离职责
  15. 共用体实现浮点数、负数的存储
  16. 将代码从OPENGL移植到OPENGL ES需要修改什么
  17. yolov5电线杆鸟巢识别
  18. spark3和hbase交互,hbase-connectors
  19. 微信小程序-tab左右滑动切换
  20. 估值百亿独角兽爱学习教育集团:通过云原生实践与时间赛跑

热门文章

  1. red hat linux 改ip,Red Hat Enterprise Linux 7(RHEL7)配置静态IP地址
  2. java sqlite busy_使用select语句锁定[SQLITE_BUSY]数据库文件
  3. 一个通用的VB磁盘文件搜索引擎类
  4. 亲历李飞飞的AI4ALL,是一种怎样的体验?
  5. 纽约大学的好奇AI特别会提问,桌游玩得比人还666
  6. Pandas 基础(17) - to_datetime
  7. https理论与实践
  8. 通信协议:HTTP、TCP、UDP
  9. c#学习笔记01——引用类
  10. 【App 支付】交易查询接口