【翻译】在Ext JS 5应用程序中如何使用路由
原文:How to Use Routing in Your Ext JS 5 Apps
简介
Ext JS 5是一个重要的发布版本,它提供了许多新特性来创建丰富的、企业级的Web应用程序。MVVM和双向数据绑定为开发人员承担了大量的繁重工作。在Ext JS 5种,另一个新特性就是路由,它可以在控制器内轻松的管理历史记录。前进和后退按钮是每个浏览器都会拥有的公共用户接口,现在,使用Ext JS 5在单页面应用程序中处理导航变得相当简单了。
Ext JS 5路由
在Ext JS,已经可以使用Ext.util.Histroy类来处理历史记录的变化,但在Ext JS 5,这个处理变得更容易和灵活。路由提供了一种更易于配置的方式来将散列值映射到控制器的方法,这包括使用参数和之前的行为来控制路由执行的流程,而在后端则使用Ext.util.History来处理。下面来看一个简单的例子:
Ext.define('MyApp.controller.Main', {
extend : 'Ext.app.Controller',
routes : {
'home' : 'onHome'
},
onHome : function() {}
});
在路由对象中,关键字“home”就是要匹配的散列值,而值“onHome”就是控制器中的方法,当散列只匹配的时候,就会执行该方法(例如:http://localhost#home)。要在控制器内改变散列值,可以使用redirectTo方法:
this.redirectTo(‘home’); //redirects to http://localhost#home
这将会将URL的散列值修改为“#home”,然后会执行MyApp.controller.Main控制器实例中路由所定义的的onHome方法。如果有多个控制器都匹配相同的散列值,执行的顺序将会根据应用程序实例的控制器数组中所定义的顺序执行。
散列值和参数
散列值还可以包含参数,路由可轻易的将他们作为参数传递给控制器的方法。带参数的散列值看起来像“#user/1234”,其中,1234是用户的ID,会被作为一个参数。可以通过以下方法来为控制器定义散列值:
Ext.define(‘MyApp.controller.Main', {
extend : 'Ext.app.Controller',
routes : {
'user/:id' : 'onUser'
},
onUser : function(id) {}
});
在为路由配置一个预期的参数的时候,需要在参数名称前添加一个冒号,在以上例子中的参数就是“:id”,路由将会把匹配的任何值作为传递参数并传递给onUser方法。传递给控制器方法的参数的顺序与路由定义时的顺序相同。
还可以使用正则表达式来控制要匹配的散列值。在用户ID的示例中,ID只能是数字值,而不允许是其他值,为了控制匹配,在路由中可以使用conditions配置项:
Ext.define('Fiddle.controller.Main', {
extend : 'Ext.app.Controller',
routes : {
'user/:id' : {
action : 'onUser',
conditions : {
':id' : '([0-9]+)'
}
}
},
onUser : function(id) {}
});
示例中演示了两样东西:路由的定义可以是一个对象,action属性对应的是控制器的方法,以及使用conditions配置项。配置项conditions是一个包含参数和正则表达式字符串的对象。采用正则表达式字符串,而不是正则表达式的原因是,路由会根据路由内的参数创建一个默认的正则表达式,而conditions配置项的作用就是重写默认的正则表达式字符串。默认的正则表达式字符串是“([%a-zA-Z0-9\\-\\_\\s,]+)”。
如果没有匹配路由的散列值,就会在应用程序中触发unmatchedroute事件,该事件可在应用程序中或控制器中进行监听,无论在哪里,监听方式都是一样的。以下是在控制器中监听的示例:
Ext.define('Fiddle.controller.Main', {
extend : 'Ext.app.Controller',
listen : {
controller : {
'*' : {
unmatchedroute : 'onUnmatchedRoute'
}
}
},
onUnmatchedRoute : function(hash) {}
});
有时候,为了避免路由继续执行或等待ajax请求这样的异步操作而延迟执行,需要将路由的处理过程挂起。为了实现这个,可以在路由中定义before操作,且可将路由中定义的任何参数传递给它。以下是一个使用ajax请求的示例,且在请求完成后继续执行路由:
Ext.define('Fiddle.controller.Main', {
extend : 'Ext.app.Controller',
routes : {
'user/:id' : {
action : 'onUser',
before : 'beforeUser',
conditions : {
':id' : '([0-9]+)'
}
}
},
beforeUser : function(id, action) {
Ext.Ajax.request({
url : '/user/confirm',
params : {
userid : id
},
success : function() {
action.resume();
},
failure : function() {
action.stop();
}
});
},
onUser : function(id) {}
});
方法beforeUser会象onUser方法一样接收id参数,不过,它还可获取到一个action参数。参数action包含有resume和stop方法用来控制路由的执行。执行action的resume方法,如Ext.Ajax.request的success处理中的那样,将会恢复路由的执行,这样就可实现路由的异步行为。执行action的stop方法,正如在failure回调函数中卡你打那样,会停止当前路由的执行。如果将true传递给stop方法,队列中的所有路由都会停止执行,这样就可以对路由实现完整的控制。
Ext JS应用程序可能会变得很大很复杂,而且有时候可能会希望在同一时间激活多个散列值。Ext JS 5有能力去处理多个散列值并分别去执行他们。单独的散列值会被沙盒化,这意味着如果需要取消一个路由,可以将true传递给action.resume方法,这就可以阻止该散列值的其他路由,而其他的散列值会继续执行。每一个散列值都需要进行分隔,如以下示例的散列值:
#user/1234|message/5ga
路由会将散列值拆分为“user/1234”和“message/5ga”。路由会根据user的值去找到所有匹配的路由并执行任何匹配的路由。如果没有匹配散列值的路由,就会触发unmatchedroute事件。接下来,路由将会根据message的值来寻找任何匹配的路由并执行他们。如果没有匹配值的路由,将会触发unmatchedroute事件。
小结
Ext JS 5中的新的路由特性是处理浏览器历史堆栈的一直简单配置方式,它不单灵活,而且功能强大,足以满足复制的应用程序的需要。与MVC+VM、双向数据绑定和其他新特性在一起,使Ext JS 5成为了一个打造企业级应用程序的完美框架。
作者:Mitchell Simoens
Mitchell is a Senior Support Engineer providing support on the forums and the portal. Mitchell also is the maintainer of Sencha Fiddle and other web properties. Mitchell is also the co-author of "Sencha Touch in Action", and is a regular contributor of Ext JS and Sencha Touch frameworks, as well as extensions and plugins on GitHub.
【翻译】在Ext JS 5应用程序中如何使用路由的更多相关文章
- 【翻译】在Ext JS 5应用程序中怎样使用路由
原文:How to Use Routing in Your Ext JS 5 Apps 简单介绍 Ext JS 5是一个重要的公布版本号,它提供了很多新特性来创建丰富的.企业级的Web应用程序.MVV ...
- 在Ext JS 5应用程序中如何使用路由
简介 Ext JS 5是一个重要的发布版本,它提供了许多新特性来创建丰富的.企业级的Web应用程序.MVVM和双向数据绑定为开发人员承担了大量的繁重工作.在Ext JS 5种,另一个新特性就是路由,它 ...
- 【翻译】Ext JS 5.0.1 中的新功能
原文:What's New in Ext JS 5.0.1 今天,我们很高兴的宣布Ext JS 5.0.1发布了!此维护版本基于Sencha社区的反馈做了一些改进.下面让我们来了解一下这些改变. 可访 ...
- 【翻译】Ext JS最新技巧——2015-8-11
原文:Top Support Tips Seth Lemmons:使用棒极了的Awesome Font Ext JS 6附带了一个新的海卫一主题,可以使用Font Awesome字体作为背景图像的图标 ...
- 【翻译】Ext JS 6有什么新东西?
工具包ToolKits 发布 包的命名 Fashion 图表 ItemEdit插件 网格 电子表格 可操作模式Actionable Mode和可访问性 LazyItems插件 屏幕阅读器支持可访问性 ...
- 将Ext JS 5应用程序导入Web项目以及实现本地化
在Ext JS 5,使用了新的脚本和样式加载方式,这对于将应用程序导入到Web项目中产生了点小麻烦.而对于本地化文件的导入,也采用了新的方式,本文将一一解答这些问题. 将Ext JS 5应用程序导入W ...
- 【翻译】Ext JS最新技巧——2014-8-13
原文:Top Support Tips Greg Barry:新的框架. 新的文档类型(Doctype) 在Ext JS 5,只支持IE8+,因此不再古力用户使用严格的HTML文档类型.现在,推荐使用 ...
- 【翻译】Ext JS——高效的编码风格指南
原文:ExtJS - Efficient coding style guide 作者:Raja 切勿使用"new"关键字:在Ext JS中,使用"new"关键字 ...
- 【翻译】Ext JS 5的委托事件和手势
原文:Delegated Events and Gestures in Ext JS 5 简介 Ext JS在5之前的版本,被设计为专用于传统鼠标输入的桌面设备使用.而从5开始,添加了对触屏输入的支持 ...
随机推荐
- Sybase identity 字段
1.identity Oracle, DB2, pgSQL中都有sequence的概念,这个概念比Identity先进很多,在Sybase中没有Sequence对象,与之相对应的是Identity 2 ...
- sublime text package control 被墙的解决办法
似乎没有办法 只能碰运气, 时好时坏. 或者手动安装 趁着好的时候, 下载离线包 https://packagecontrol.io/Package%20Control.sublime-package ...
- lua 序列化函数
local function f( ... ) print('hello') end local x = string.dump(f, true) loadstring(x)()
- pycallgraph 追踪Python函数内部调用
安装 安装pycallgraph 安装依赖 使用 待测脚本 追踪脚本 追踪结果 高级篇 隐藏私密函数 控制最大追踪深度 总结 GitHub上好代码真的是太多了,名副其实的一个宝藏.但是最近自己也反思了 ...
- Python excel 奇怪的通信规则
直接: for i in range(1,n+1): print(i) if xls.getCell(i,1,1)=='id': res=[] xls.xlBook.Worksheets(i).Nam ...
- 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...
- JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践
JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识 ...
- 编译GDAL支持OpenCL使用GPU加速
前言 GDAL库中提供的gdalwarp支持各种高性能的图像重采样算法,图像重采样算法广泛应用于图像校正,重投影,裁切,镶嵌等算法中,而且对于这些算法来说,计算坐标变换的运算量是相当少的,绝大部分运算 ...
- Android开发_TextView跑马灯
关键代码: android:singleLine="true" android:ellipsize="marquee" android:focusable=&q ...
- SSH网上商城---使用ajax完成用户名是否存在异步校验
小伙伴在上网的时候,需要下载或者观看某些视频资料,更或者是在逛淘宝的时候,我们都需要注册一个用户,当我们填写好各种信息,点击确定的时候,提示用户名已经存在,小编就想,为什么当我们填写完用户名的时候,她 ...