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

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

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

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

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

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

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

代码如下:

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

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

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

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

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

代码如下:

 //公用类
Ext.define('app.util', {
alternateClassName: 'util',
statics: {
//比较两个对象是否相等
equals: function (x, y) {
if (x === y) {
return true;
}
if (!(x instanceof Object) || !(y instanceof Object)) {
return false;
}
if (x.constructor !== y.constructor) {
return false;
}
for (var p in x) {
if (x.hasOwnProperty(p)) {
if (!y.hasOwnProperty(p)) {
return false;
}
if (x[p] === y[p]) {
continue;
}
if (typeof (x[p]) !== "object") {
return false;
}
if (!Object.equals(x[p], y[p])) {
return false;
}
}
}
for (p in y) {
if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) {
return false;
}
}
return true;
},
//重写ajax(需要初始化)
overrideAjax: function () {
var me = this;
//开始加载
Ext.Ajax.on('beforerequest',
function (connection, options) {
if (!options.hidMessage) {
me.showMessage('正在努力加载中...');
}
});
//加载成功
Ext.Ajax.on('requestcomplete',
function (connection, options) {
me.hideMessage();
});
//加载失败
Ext.Ajax.on('requestexception',
function (connection, options) {
if (!options.hidMessage) {
me.showMessage('加载失败,请检查网络是否正常...', true);
}
});
},
//重写list(需要初始化)
overrideList: function () {
//重写分页插件
Ext.define("Ext.zh.plugin.ListPaging", {
override: "Ext.plugin.ListPaging",
config: {
//自动加载
autoPaging: true,
//滚动到最底部时是否自动加载下一页数据
noMoreRecordsText: '没有更多内容了',
loadMoreText: '加载更多...' //加载更多按钮显示内容
}
});
//重写下拉刷新
Ext.define("Ext.zh.plugin.PullRefresh", {
override: "Ext.plugin.PullRefresh",
config: {
lastUpdatedText: '上次刷新时间:',
loadedText: '等一会再刷新吧...',
loadingText: '加载中...',
pullText: '下拉可以手动刷新',
releaseText: '松开可以刷新',
lastUpdatedDateFormat: 'Y-m-d H:i'
}
});
//重写List
Ext.define("Ext.zh.List", {
override: "Ext.List",
config: {
//取消选择效果
selectedCls: '',
//禁用加载遮罩,防止跳转时页面卡顿,使用统一的遮罩效果
loadingText: false,
cls: 'list',
deferEmptyText: false,
emptyText: '没有更多内容了'
}
});
},
//重写Pick相关(需要初始化)
overridePick: function () {
Ext.Date.monthNames = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"];
Ext.define("Ext.zh.DatePicker", {
override: "Ext.picker.Date",
config: {
yearFrom: 2000,
monthText: '月',
dayText: '日',
yearText: '年'
}
});
Ext.define("Ext.local_zh_cn.Picker", {
override: "Ext.picker.Picker",
applyDoneButton: function (config) {
if (config) {
if (Ext.isBoolean(config)) {
config = {};
}
if (typeof config == "string") {
config = {
text: config
};
}
Ext.applyIf(config, {
ui: 'action',
align: 'right',
text: '确定'
});
}
return Ext.factory(config, 'Ext.Button', this.getDoneButton());
},
applyCancelButton: function (config) {
if (config) {
if (Ext.isBoolean(config)) {
config = {};
}
if (typeof config == "string") {
config = {
text: config
};
}
Ext.applyIf(config, {
align: 'left',
text: '取消'
});
}
return Ext.factory(config, 'Ext.Button', this.getCancelButton());
} });
},
//app初始化执行
inIt: function () {
this.overrideList();
this.overrideAjax();
this.addMessage();
this.overridePick();
}
}
});

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

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

代码如下:

 Ext.application({
name: 'app',
requires: ['app.config','app.util', 'Ext.MessageBox'],
controllers: ['Main', 'Used', 'User', 'Job'],
launch: function () {
// Destroy the #appLoadingIndicator element
Ext.fly('appLoadingIndicator').destroy();
util.inIt();
// Initialize the main view
Ext.Viewport.add(Ext.create('app.view.Main'));
}
});

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

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

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

代码如下:

 Ext.define('app.view.About', {
alternateClassName: 'about',
extend: 'Ext.Container',
xtype: 'about',
requires: ['ux.plugin.ConHref'],
config: {
title: '关于我们',
margin: 10,
plugins: 'conHref',
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>'
}
});

这是一个视图类,所在路径为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的模式,这意味着如果我们知道一个配置项,也就知道如何获取和设置它的值了。

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

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

可以如下:

 /**
* 基于Ext.navigation.Bar
* 去除动画切换等功能
* 可以灵活的在NavigationView子项中配置属性
* 小写开头表示这是私有控件,不能直接使用
*/
Ext.define('ux.navigationBar', {
extend: 'Ext.TitleBar',
requires: [
'Ext.Button',
'Ext.Spacer'
],
config: {
/*导航栏标题*/
title: null,
/*item默认类型*/
defaultType: 'button',
layout: {
type: 'hbox'
},
/*返回按钮*/
backButton: {
align: 'left',
ui: 'back',
hidden: true
}
},
/*初始化配置*/
constructor: function (config) {
config = config || {};
if (!config.items) {
config.items = [];
}
this.callParent([config]);
},
/*创建返回按钮*/
applyBackButton: function (config) {
return Ext.factory(config, Ext.Button, this.getBackButton());
},
/*更新返回按钮*/
updateBackButton: function (newBackButton, oldBackButton) {
if (oldBackButton) {
this.remove(oldBackButton);
}
if (newBackButton) {
this.add(newBackButton); newBackButton.on({
scope: this,
tap: this.onBackButtonTap
});
}
},
/*点击返回按钮时触发*/
onBackButtonTap: function () {
this.fireEvent('back', this);
}
});

如上,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 入门系列 (八)sencha touch类系统讲解(下)

    接着上一讲,我们通过一组代码来讲解一下st的类的一些属性: Ext.define("MyConfig",{ config:{ website:"http://127.0. ...

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

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

  4. 第一步 使用sencha touch cmd 4.0 创建项目、打包(加入全局变量、公用类、自定义扩展、资源文件)

    参考资料: http://www.cnblogs.com/qqloving/archive/2013/04/25/3043606.html http://www.admin10000.com/docu ...

  5. 亲手使用Sencha Touch + phonepag开发Web APP随笔 -- 第一个APP

    参考博文: [Phonegap+Sencha Touch] 移动开发1.准备工作 [Phonegap+Sencha Touch] 移动开发2.PhoneGap/Cordova初步使用   经过差不多1 ...

  6. sencha touch打包成安装程序

    为了更好地向大家演示如何打包一个sencha touch的项目,我们用sencha cmd创建一个演示项目,如果你的sencha cmd环境还没有配置,请参照 sencha touch 入门系列 (二 ...

  7. Sencha Touch 2.2 Store Proxy 异常监控

    移动端到服务端通信往往会发生很多莫名的异常情况,如何有效的监控proxy异常,给用户友好的用户体验呢? Proxy给我提供了异常exception的监听事件,只需要监控该项目即可. Sencha To ...

  8. sencha touch 入门系列 (二)sencha touch 开发准备

    这是本人第一次写博客教程,没什么经验,文笔也不是很好,写这教程一方面为了巩固自己这段时间的学习成果,一方面帮助大家解决问题,欢迎大家多提建议,指出问题.接下来我们就开始我们的sencha touch开 ...

  9. 初探 Ext JS 6 (sencha touch/ext升级版)

    Sencha Touch 现在已全面升级至Ext Js 6,那么我们如何使用他们呢? 首先去官网下载最新的sdk和帮助文档 sdk下载地址:https://www.sencha.com/product ...

随机推荐

  1. Spring简单集成Redis

  2. 用shell 实现对MySQL数据库分页

    参考链接 http://mp.weixin.qq.com/s?__biz=MzAxMzE4MDI0NQ==&mid=208299533&idx=1&sn=4cab00793eb ...

  3. [AngularJS]ng-repeat指令要点

    ng-repeat指令要点 1,基本格式,这里不作过多说明,需要的话查看文档 <div ng-repeat="item in someCollection [| someFilter: ...

  4. npm安装包卡住不动的解决

    最近诸事不顺,今天更新/安装nodejs各种包也全都卡在各个环节,用ie设了全局代理貌似也没什么改观,于是到网上找找有没有国内镜像站,倒是发现了cnpmjs.org这个网站被推荐比较多,看他们主页,他 ...

  5. Django系列之form渲染表单后css样式丢失

    最通用的form写法 我们经常看各大网站上写这样的form写法 class SYSAdminPhysicalForm(forms.ModelForm): ''' this form for idc's ...

  6. SQL随机生成6位数字

    SELECT RIGHT(100000000 + CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 6)

  7. 安装MySQL后经常弹出taskeng.exe~

    taskeng.exe,是Microsoft任务计划程序引擎调用的安全进程.文件路径为C:\Windows\system32\taskeng.exe.大小165KB. 解决办法:  这个问题是Wind ...

  8. SpringMVC------报错:java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter

    详细信息: java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter 严重: E ...

  9. LeetCode[Array]----3Sum

    3Sum Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find a ...

  10. 精神状态: Confused

    阿里和网易都已开放简历投递入口,本以为招聘季9月才开始的我,着实被震惊到了. 我还没准备好呢,远没有准备好. 这次日志,主要是想写三点.实习经历.接下来的计划.最后,自已在未来应该维持的心态. 关于实 ...