再探 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如果你重写了模型和验证模块,现在大概是不能用了,需要重新看源码来写了,楼主的自定义验证模块完全就废了。

最后就是路由这一块发生了变化,这个变化挺大的。例如

1         this.redirectTo(‘redirect/newsInfo‘);
2         util.recordLoad(this.getInfo(), config.news.info, {
3             NewsID: record.get(‘id‘),
4             UserID: config.userMes ? config.userMes.id : 0
5         }, record, ‘Info‘);

在sencha touch中,this.redirectTo(‘redirect/newsInfo‘);这行代码会触发我在main控制层中的视图切换方法,也就是以下代码。

 1 showView: function (view, count) {
 2         //如果正在登录中,中断执行
 3         if (config.isLogin) {
 4             return;
 5         }
 6         var main = this.getMain() || this.getLogin(),
 7         params = config.tmpParams;
 8         if (main) {
 9             //登录检测
10             //根据config.ckLogin和用户信息检测
11             if (config.ckLogin[view] && !config.userMes.id) {
12                 //没有登录则跳转到登录页面
13                 params = params || {};
14                 //为登录页面添加配置,登录成功后判断跳转位置
15                 params.redirect = view;
16                 view = ‘userLogin‘;
17             }
18             if (!view) {
19                 count = 1;
20             }
21             if (count && !Ext.isNumber(count) && count.match(/^\+?[1-9][0-9]*$/)) {
22                 count = Number(count);
23             }
24             if (count) {
25                 main.popAndPush(view, count, params);
26             } else {
27                 main.push(view, params);
28             }
29         }
30         delete config.tmpParams;
31     }

在这里动态创建了newsInfo视图,然后通过this.getInfo()方法获取到视图对象,最后给这个视图赋值。

在ext js 6中,这个代码完全失效了,经过测试发现showView方法的执行顺序在util.recordLoad这段代码之后执行了,也就是说这个时候this.getInfo()方法获取的是一个null

怎么办?我们可以这样处理

this.redirectTo(‘redirect/newsInfo‘,true);

强制触发路由事件,不过这样你会发现showView这个方法被触发了两次,这样怎么可以!怎么办?重写路由这一块!代码如下

 1   Ext.define(‘Ext.zh.util.History‘, {
 2                 override: ‘Ext.util.History‘,
 3                 //因为在redirectTo里面已经触发了方法,所以这里就不应该再次触发,直接清空
 4                 handleStateChange: function (token) {
 5                 }
 6             });
 7             Ext.define(‘Ext.zh.app.BaseController‘, {
 8                 override: ‘Ext.app.BaseController‘,
 9                 redirectTo: function (token) {
10                     if (token.isModel) {
11                         token = token.toUrl();
12                     }
13                     //立刻执行路由触发的方法,没有做重复触发判定,使用过程中注意处理
14                     Ext.app.route.Router.onStateChange(token);
15                     //加入历史记录,如果不想url发生变化,可以注释掉
16                     //Ext.util.History.add(token);
17                     return true;
18                 }
19             });

这样勉强达到了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视图,这样不会出错,很奇怪。

 1         recordLoad: function (url, params, record, ckName) {
 2             //如果record存在,并且ckName这个字段中有值
 3             //所以已经请求过了,直接设置值即可
 4             if (record && record.get(ckName)) {
 5                 return;
 6             }
 7             //据需求决定用jsonp还是ajax
 8             //Ext.data.JsonP.request
 9             Ext.Ajax.request({
10                 url: url,
11                 params: params,
12                 success: function (data) {
13                     //处理返回值,转换为json对象
14                     data = Ext.decode(data.responseText)[0] || Ext.decode(data.responseText);
15                     record.set(data);
16                 }
17             });
18         },

感觉坑还是挺多的,各位有啥好的填坑方法记得告诉我。我会继续分享我的心得。

时间: 2024-10-19 20:55:20

再探 Ext JS 6 (sencha touch/ext升级版) 变化篇 (编译命令、滚动条、控制层、模型层、路由)的相关文章

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

Sencha Touch 现在已全面升级至Ext Js 6,那么我们如何使用他们呢? 首先去官网下载最新的sdk和帮助文档 sdk下载地址:https://www.sencha.com/products/extjs/evaluate/ 如图,这个是试用版下载地址,试用版和正版的区别大概就是试用版有试用标记水印吧,大概是吧. 官方api下载地址:http://docs.sencha.com/extjs/6.0/ 这个就是官方的在线api了,想要下载就把鼠标移动到左上角的Ext JS Guides上

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

原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置,因而,不需要手动去管理那些碎片.Ext JS与Sencha Touch的布局类有许多相似之处,最近在 Ivan Jouikov的这篇博文中对他们进行了详细的分析. 虽然是这样,但很多Ext JS和Sencha Touch开发人员可能永远都不会去了解布局系统的机制原理.Sencha框架已经提供了最常

再探 butterfly.js - grunt.js篇(一)

再探 butterfly.js - grunt.js篇(一) 神器 grunt.js 久仰grunt.js的大名,学习grunt.js一直是我todo List的第一位.趁着新春佳节来临之际(打酱油的日子),就来填了这个坑,完了这个心愿. grunt.js的强大,强大在于它拥有很多用途丰富的插件,和不同插件之间的联动实现更牛逼的功能. 这里默认大家已经安装了npm和会用npm install等指令,就不详细讲了.下面讲用到grunt-contrib-watch和grunt-contrib-con

再探 butterfly.js - 奇异的留白

再探 butterfly.js - 奇异的留白 事情经过 在 梓凡兄 捣鼓他的 豆瓣FM 播放器的时候,发现了butterfly.js会在ipad的横屏模式(landscape mode)的时候对<html>添加class="ipad ios7".更加离奇的是在butterfly.css有以下样式: @media (orientation:landscape){ html.ipad.ios7 > body{ position:fixed;bottom:0;width:

再探 butterfly.js - 抛砖引玉篇(notification.js)

再探 butterfly.js - 抛砖引玉篇(notification.js) 事情经过 今天又来研究butterfly.js的源码(打酱油),发现了一个notification.js.顾名思义notification就是公告栏嘛,那么这个notification.js到底有什么用途呢?题外话:还有十几天就过年- 我的新年愿望是:准时出粮! 正片 先贴效果图: 显然,这真的是一个显示状态的公告栏.万万没有想到butterfly.js会内置了这类插件.那个这个notification.js到底要

Ext JS学习第九天 Ext基础之 扩展原生的javascript对象

此文来记录学习笔记: •Ext对于原生的javascript对象进行了一系列的扩展,我们把他们掌握好,更能深刻的体会Ext的架构,从而对我们的web开发更好的服务, 源码位置,我们可以从开发包的这个位置找到这几个扩展的js源码: •extjs-4.1.1\src\core\src\lang\ •ExtJS扩展原生Javascript –Ext.Object –Ext.Number –Ext.String –Ext.Array –Ext.Function –Ext.Date –Ext.Error

Ext JS学习第八天 Ext基础之 认识Ext.js 和Ext-more.js

此文来记录学习笔记: •认识Ext.js 和Ext-more.js •首先,我们要知道这2个js文件的作用,这俩个文件包含了Ext的一些基础定义.基本的属性和方法,我们要重点学习和深入底层代码进行研究. •如果所示:API位置 . •Ext.js方法详解: –Ext.apply&Ext.applyIf –Ext.extend –typeOf –isEmpty.isIterable.isFunction.isArray... –Iterate 下面从栗子中看看这些方法是实际使用方法,请看栗子代码吧

Ext JS学习第十二天 Ext基础之操作dom ; get与fly 方法

此文用来记录学习笔记 •嗯!首先,什么是DOM(Document Object Model) –W3C对DOM的定义:文档对象模型是一个平台,一个中立于语言的应用程序编程接口(API),允许程序访问并更改文档的内容.结构和样式. –其实DOM是一种通用的模型.不止在我们的HTML中存在,也可以在其他文件中存在,相信你最熟悉的就是XML了吧,其实还有很多... –DOM的发展也非常的漫长,版本延续,产生了0级DOM.1级DOM.2级DOM和最新的3级DOM,那么相对成熟的就是从2级DOM以后了.每

【翻译】探究Ext JS 5和Sencha Touch的布局系统

原文:Exploring the Layout System in Ext JS 5 and Sencha Touch 布局系统是Sencha框架中最强大和最有特色的一个部分. 布局要处理应用程序中每一个组件的尺寸和位置.在Ext JS和Sencha Touch直接有很多相似之处.尤其是如今Ext JS 5開始支持平板更是如此.以下让我们来探讨一下布局系统是怎样跨域Sencha框架进行工作的. 布局简史 最主要的HTML一直都缺乏一个严格定义的布局系统. 很多年来,因为CSS实现的差距.开发跨浏