sencha touch 类的使用
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 类的使用的更多相关文章
- sencha touch 入门系列 (七)sencha touch 类系统讲解(上)
在mvc结构的基础上,sencha touch又使用了sencha公司为extjs4开发出来的类系统,在面向对象的编程语言中,类是对对象的定义,它描述了对象所包含的大量属性和方法. 跟面向对象语言类似 ...
- sencha touch 入门系列 (八)sencha touch类系统讲解(下)
接着上一讲,我们通过一组代码来讲解一下st的类的一些属性: Ext.define("MyConfig",{ config:{ website:"http://127.0. ...
- 【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之三
原文:Getting Started with Sencha Touch 2: Build a Weather Utility App (Part 3) 作者:Lee BoonstraLee is a ...
- 第一步 使用sencha touch cmd 4.0 创建项目、打包(加入全局变量、公用类、自定义扩展、资源文件)
参考资料: http://www.cnblogs.com/qqloving/archive/2013/04/25/3043606.html http://www.admin10000.com/docu ...
- 亲手使用Sencha Touch + phonepag开发Web APP随笔 -- 第一个APP
参考博文: [Phonegap+Sencha Touch] 移动开发1.准备工作 [Phonegap+Sencha Touch] 移动开发2.PhoneGap/Cordova初步使用 经过差不多1 ...
- sencha touch打包成安装程序
为了更好地向大家演示如何打包一个sencha touch的项目,我们用sencha cmd创建一个演示项目,如果你的sencha cmd环境还没有配置,请参照 sencha touch 入门系列 (二 ...
- Sencha Touch 2.2 Store Proxy 异常监控
移动端到服务端通信往往会发生很多莫名的异常情况,如何有效的监控proxy异常,给用户友好的用户体验呢? Proxy给我提供了异常exception的监听事件,只需要监控该项目即可. Sencha To ...
- sencha touch 入门系列 (二)sencha touch 开发准备
这是本人第一次写博客教程,没什么经验,文笔也不是很好,写这教程一方面为了巩固自己这段时间的学习成果,一方面帮助大家解决问题,欢迎大家多提建议,指出问题.接下来我们就开始我们的sencha touch开 ...
- 初探 Ext JS 6 (sencha touch/ext升级版)
Sencha Touch 现在已全面升级至Ext Js 6,那么我们如何使用他们呢? 首先去官网下载最新的sdk和帮助文档 sdk下载地址:https://www.sencha.com/product ...
随机推荐
- C# Image与Base64编码互转函数
public Bitmap GetImageFromBase64(string base64string) { byte[] b = Convert.FromBase64String(base64st ...
- Peckham添加引用文件模糊匹配智能提示
下载地址:https://github.com/markohlebar/Peckham 跟VVDocumenter规范注释生成器的安装方式一样: 下载开源工程在Xcode重新编译运行会自动安装此插 ...
- spring原理机制
转自:http://blog.csdn.net/nrain2/article/details/45459311 1,关于spring容器: spring容器是Spring的核心,该 容器负责管理spr ...
- MathType调整矩阵分隔线粗细的方法
矩阵是线性代数的重要的组成部分,对于矩阵的计算,一般会先找一些规律再进行计算这样会更加方便.对于比较复杂的矩阵,在寻找规律时经常会将矩阵进行分割,我们将这种矩阵称为分块矩阵.有时为了表示矩阵的这种分块 ...
- QT运行出错:QObject::connect: Parentheses expected以及QObject::connect: No such slot ***
我在QGraphicsScene子类中添加了item的弹出菜单,并连接Action到槽函数,结果槽函数不起作用,输出:QObject::connect: No such slot *** C++ C ...
- opencv获取IP摄像头(IP-camera)实时视频流
之前这篇文章讲了如何通过网络摄像头(web camera)获取实时视频流,但是这种方法的缺陷就是摄像头和主机必须连在一起,那这种在室外部署的时候就会非常麻烦并且不安全,所以后来找了下用海康威视或者大华 ...
- symfony window下的安装 安装时候出现的问题以及解决方案
1. cmd进入DOS , cd 到 php.exe 的目录下 2. php -r "readfile('http://symfony.com/installer');&q ...
- mysql中将一个数据类型转换成另外的数据类型?mysql中cast函数的使用?
需求描述: 今天在看mysql的函数,提到了通过cast函数将一个数据类型值转换为特定类型的结果值. 在此记录下.将一个表达式转换为特定精度的小数. 操作过程: 1.查看6/4的结果 mysql; + ...
- mysql中显示当前数据库下的所有表,包括视图。
环境说明: mysql版本:5.5.57-log 操作系统:Red Hat Enterprise Linux Server release 6.6 (Santiago) 需求:查看当前数据库下所有的表 ...
- MTK 关闭安全模式
1.当 Android 设备在安全模式(Safe Mode)下工作时,任何的第三方应用程序或相关文件(主要为apk应用程序文件)都不可以使用,但可以使用 Android 设备的任务管理器选项进行卸载或 ...