再探 Ext JS 6 (sencha touch/ext升级版) 变化篇 (编译命令、滚动条、控制层、模型层、路由)
从sencha touch 2.4.2升级到ext js 6,cmd版本升级到6.0之后发生了很多变化
首先从cmd说起,cmd 6 中sencha app build package不能使用了,sencha app build native好像也不能用了。
有个好消息就是我们可以用
sencha ant native build
sencha ant package build
这两个命令,目测和以前的效果差不多了
然后再说说ext js 6相对sencha touch 2.4.2的变化
首先最只管的就是在网页上滚动条变了,如图
移动端没有变化,如图
想要统一他们的显示效果可能需要花一下心思看看源码了
然后控制层和模型层发生了变化
以前的控制层是这样,如图
现在是这样,如图
也就是说views,models,还有图片上没显示的stores现在是和config配置同级了,楼主搞了半天才明白错在那里
另外模型层也发生了变化
以前是这样,如图
现在是这样,如图
没有了config,奇怪的是数据仓库层,也就是store没有变化,很奇怪。
另外原来sencha touch如果你重写了模型和验证模块,现在大概是不能用了,需要重新看源码来写了,楼主的自定义验证模块完全就废了。
最后就是路由这一块发生了变化,这个变化挺大的。例如
this.redirectTo('redirect/newsInfo');
util.recordLoad(this.getInfo(), config.news.info, {
NewsID: record.get('id'),
UserID: config.userMes ? config.userMes.id : 0
}, record, 'Info');
在sencha touch中,this.redirectTo('redirect/newsInfo');这行代码会触发我在main控制层中的视图切换方法,也就是以下代码。
showView: function (view, count) {
//如果正在登录中,中断执行
if (config.isLogin) {
return;
}
var main = this.getMain() || this.getLogin(),
params = config.tmpParams;
if (main) {
//登录检测
//根据config.ckLogin和用户信息检测
if (config.ckLogin[view] && !config.userMes.id) {
//没有登录则跳转到登录页面
params = params || {};
//为登录页面添加配置,登录成功后判断跳转位置
params.redirect = view;
view = 'userLogin';
}
if (!view) {
count = 1;
}
if (count && !Ext.isNumber(count) && count.match(/^\+?[1-9][0-9]*$/)) {
count = Number(count);
}
if (count) {
main.popAndPush(view, count, params);
} else {
main.push(view, params);
}
}
delete config.tmpParams;
}
在这里动态创建了newsInfo视图,然后通过this.getInfo()方法获取到视图对象,最后给这个视图赋值。
在ext js 6中,这个代码完全失效了,经过测试发现showView方法的执行顺序在util.recordLoad这段代码之后执行了,也就是说这个时候this.getInfo()方法获取的是一个null
怎么办?我们可以这样处理
this.redirectTo('redirect/newsInfo',true);
强制触发路由事件,不过这样你会发现showView这个方法被触发了两次,这样怎么可以!怎么办?重写路由这一块!代码如下
Ext.define('Ext.zh.util.History', {
override: 'Ext.util.History',
//因为在redirectTo里面已经触发了方法,所以这里就不应该再次触发,直接清空
handleStateChange: function (token) {
}
});
Ext.define('Ext.zh.app.BaseController', {
override: 'Ext.app.BaseController',
redirectTo: function (token) {
if (token.isModel) {
token = token.toUrl();
}
//立刻执行路由触发的方法,没有做重复触发判定,使用过程中注意处理
Ext.app.route.Router.onStateChange(token);
//加入历史记录,如果不想url发生变化,可以注释掉
//Ext.util.History.add(token);
return true;
}
});
这样勉强达到了sencha touch中的效果,不过问题有来了,在ajax请求数据时,会有问题,代码如下:
recordLoad: function (view, url, params, record, ckName) {
//如果record存在,并且ckName这个字段中有值
//所以已经请求过了,直接设置值即可
if (record && record.get(ckName)) {
view.setRecord(record);
return;
}
//据需求决定用jsonp还是ajax
//Ext.data.JsonP.request
Ext.Ajax.request({
url: url,
params: params,
success: function (data) {
//处理返回值,转换为json对象
data = Ext.decode(data.responseText)[0] || Ext.decode(data.responseText);
//如果模型存在,直接赋值,并且给详细视图赋值
//如果涉及到修改这一块,模型存在会省很多事
//请看http://www.cnblogs.com/mlzs/archive/2013/05/29/3106241.html
if (record) {
record.set(data);
view.setRecord(record);
} else {
//如果模型不存在,直接给详细视图赋值
view.setData(data);
}
}
});
}
如果使用navigationView,在第二次进入视图时会报错,目前还没找到解决方法!如图
最后代码改成这样
config.tmpParams.record = record;
this.redirectTo('redirect/newsInfo')
util.recordLoad(config.news.info, {
NewsID: record.get('id'),
UserID: config.userMes ? config.userMes.id : 0
}, record, 'Info');
关键代码 config.tmpParams.record = record;这里通过路由触发的方法处理,会把record直接初始化给newsInfo视图,这样不会出错,很奇怪。
recordLoad: function (url, params, record, ckName) {
//如果record存在,并且ckName这个字段中有值
//所以已经请求过了,直接设置值即可
if (record && record.get(ckName)) {
return;
}
//据需求决定用jsonp还是ajax
//Ext.data.JsonP.request
Ext.Ajax.request({
url: url,
params: params,
success: function (data) {
//处理返回值,转换为json对象
data = Ext.decode(data.responseText)[0] || Ext.decode(data.responseText);
record.set(data);
}
});
},
感觉坑还是挺多的,各位有啥好的填坑方法记得告诉我。我会继续分享我的心得。
再探 Ext JS 6 (sencha touch/ext升级版) 变化篇 (编译命令、滚动条、控制层、模型层、路由)的更多相关文章
- 初探 Ext JS 6 (sencha touch/ext升级版)
Sencha Touch 现在已全面升级至Ext Js 6,那么我们如何使用他们呢? 首先去官网下载最新的sdk和帮助文档 sdk下载地址:https://www.sencha.com/product ...
- 【翻译】在Ext JS和Sencha Touch中创建自己定义布局
原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...
- 【翻译】在Ext JS和Sencha Touch中创建自定义布局
原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...
- 【翻译】为Ext JS和Sencha Touch开发人员准备的应用程序监测(App Inspector)
和其他的Sencha开发人员一样,我会花费大约半天的时间在我喜欢的IDE工具上编写JavaScript,而另一半时间则是在浏览器上测试和调试我的应用程序.在过去几年,每一个主要的浏览器都已大为改善.现 ...
- sencha touch Ext.app.Application
Ext.app.Application一般用于app.js中 用来初始化整个应用 可以预先加载controllers(控制器),models(模型),stores(数据源),views(视图) 例如: ...
- Ext JS学习第九天 Ext基础之 扩展原生的javascript对象
此文来记录学习笔记: •Ext对于原生的javascript对象进行了一系列的扩展,我们把他们掌握好,更能深刻的体会Ext的架构,从而对我们的web开发更好的服务, 源码位置,我们可以从开发包的这个位 ...
- Ext JS学习第八天 Ext基础之 认识Ext.js 和Ext-more.js
此文来记录学习笔记: •认识Ext.js 和Ext-more.js •首先,我们要知道这2个js文件的作用,这俩个文件包含了Ext的一些基础定义.基本的属性和方法,我们要重点学习和深入底层代码进行研究 ...
- sencha touch 入门系列 扩展篇之sencha touch 项目打包压缩
经常有新手同学抱怨说sencha touch的项目加载速度为什么这么慢,经常要10秒左右的时间甚至更多, 大家都知道,sencha touch开发的项目中引用了大量的js文件,当我们打开项目时,st的 ...
- sencha touch/Ext Js 6 + 自定义扩展的用法
app.js中加入以下代码 //指定ux起调目录 Ext.Loader.setPath({ 'ux': 'app/ux' }); 在app目录中创建一个ux文件夹 假如我们使用这个扩展,扩展地址:ht ...
随机推荐
- C#与数据库访问技术总结(五)之Command对象的常用方法
Command对象的常用方法 说明:上篇总结了Command对象的几个数据成员,这节总结Command对象的常用方法. 同样,在不同的数据提供者的内部,Command对象的名称是不同的,在SQL Se ...
- 【UML】如何看Android的UML图
UML图有很多类型,这里只讨论最重要也最常用的两种 - 类图和时序图. 1. 类图 通过类图,我们可以很容易的了解代码架构,理清模块之间的关系, 包括继承(Inheritance),实现(realiz ...
- winform下重画ListBox
Windows Forms是由Win32 API封装的开发组件,最初是为了替代mfc,但却没有体现与Model View Controller架构对应的特色,进而在.net framework 3.0 ...
- 将外卖O2O广告一棍子打成竞价排名,秤把平了吗?
近日,诸多媒体报道称美团外卖.饿了么等外卖O2O将竞价排名引入外卖平台当中进行广告运营一事闹得沸沸扬扬.那么,美团外卖.饿了么真的都是竞价排名吗? 其实,美团外卖的付费推广仅仅只是针对列表的固定位置, ...
- iOS-网络请求-AFN升级至AFN3.0
AFNetworking是一款在OS X和iOS下都令人喜爱的网络库.为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持. ...
- iOS开发——高级技术&系统应用于系统服务
系统应用于系统服务 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定的协议来打开不同的 ...
- MySql 分页
MySql 分页 由于最近项目需要,于是就简单写了个分页查询.总体而言MySql 分页机制较为简单.数据库方面只需要使用limit即可实现分页.前后台交互就直接用session传了值. 下面就写写具体 ...
- 关于 ‘--exec’ 参数( find 命令)及介绍 ‘xargs ’命令区别(新版)
前言: find 命令一直都是系统管理员的常用命令之一, 其参数中 "-exec" 尤其实用.而 "xargs" 命令,针对查询也有属于自己的见解.本文着重讲解 ...
- python pycurl模块
一.pycurl概述 PycURl是一个C语言写的libcurl的python绑定库.libcurl 是一个自由的,并且容易使用的用在客户端的 URL 传输库.它的功能很强大,在PyCURL的主页上介 ...
- 使用Gulp和Browserify来搭建React应用程序
对React有一定了解之后,我们知道,需要把JSX文件转换成JS文件,组件需要导入导出.本篇就体验使用Gulp把JSX文件转换成JS文件,使用Browserify来把组件捆绑到一个文件并理顺组件之间的 ...