原文: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应用程序中如何使用路由的更多相关文章

  1. 【翻译】在Ext JS 5应用程序中怎样使用路由

    原文:How to Use Routing in Your Ext JS 5 Apps 简单介绍 Ext JS 5是一个重要的公布版本号,它提供了很多新特性来创建丰富的.企业级的Web应用程序.MVV ...

  2. 在Ext JS 5应用程序中如何使用路由

    简介 Ext JS 5是一个重要的发布版本,它提供了许多新特性来创建丰富的.企业级的Web应用程序.MVVM和双向数据绑定为开发人员承担了大量的繁重工作.在Ext JS 5种,另一个新特性就是路由,它 ...

  3. 【翻译】Ext JS 5.0.1 中的新功能

    原文:What's New in Ext JS 5.0.1 今天,我们很高兴的宣布Ext JS 5.0.1发布了!此维护版本基于Sencha社区的反馈做了一些改进.下面让我们来了解一下这些改变. 可访 ...

  4. 【翻译】Ext JS最新技巧——2015-8-11

    原文:Top Support Tips Seth Lemmons:使用棒极了的Awesome Font Ext JS 6附带了一个新的海卫一主题,可以使用Font Awesome字体作为背景图像的图标 ...

  5. 【翻译】Ext JS 6有什么新东西?

    工具包ToolKits 发布 包的命名 Fashion 图表 ItemEdit插件 网格 电子表格 可操作模式Actionable Mode和可访问性 LazyItems插件 屏幕阅读器支持可访问性 ...

  6. 将Ext JS 5应用程序导入Web项目以及实现本地化

    在Ext JS 5,使用了新的脚本和样式加载方式,这对于将应用程序导入到Web项目中产生了点小麻烦.而对于本地化文件的导入,也采用了新的方式,本文将一一解答这些问题. 将Ext JS 5应用程序导入W ...

  7. 【翻译】Ext JS最新技巧——2014-8-13

    原文:Top Support Tips Greg Barry:新的框架. 新的文档类型(Doctype) 在Ext JS 5,只支持IE8+,因此不再古力用户使用严格的HTML文档类型.现在,推荐使用 ...

  8. 【翻译】Ext JS——高效的编码风格指南

    原文:ExtJS - Efficient coding style guide 作者:Raja 切勿使用"new"关键字:在Ext JS中,使用"new"关键字 ...

  9. 【翻译】Ext JS 5的委托事件和手势

    原文:Delegated Events and Gestures in Ext JS 5 简介 Ext JS在5之前的版本,被设计为专用于传统鼠标输入的桌面设备使用.而从5开始,添加了对触屏输入的支持 ...

随机推荐

  1. Request JSON

    https://developer.android.com/training/volley/request.html Request JSON Volley provides the followin ...

  2. MySQL注释中的sql也可能执行

    MySql支持三种注释形式:# 和–属于单行注释,注释范围为该行的结尾:/* */注释属于多行注释,此外该种注释还可以实现行内注释.具体的使用情况如下图中所示(四种使用情形): 除此之外,/* */这 ...

  3. [系统运维]Supervisord安装和启动程序

    supervisord 是client/server 系统 把不是守护进程的进程变成守护进程 监控它自己启动的进程,类似于看门狗 可以作为开机启动的一种封装 可以精确控制进程的状态,而不是pidfil ...

  4. 不应滥用named let

    > (define (f x) x) > (define (g x) (let rec((x x)) x)) > (define a '(1 2 3)) > (f a) ( ) ...

  5. html5全解析

    htm是软件开发中非常基础的知识,也是很重要的知识,在web中是很重要的知识点,在此梳理一下主要内容: 1.HTML是什么? 全称为HyperText Markup Language,超文本标记语言, ...

  6. SpriteKit物理引擎碰撞中5个重要信息

    我们知道在SpriteKit物理引擎实际是基于Box2D! 在SpriteKit中当你设置好适当的碰撞参数后,通过遵守SKPhysicsContactDelegate,你可以选择实现2各碰撞回调方法: ...

  7. maven项目管理

    systemPath方式 有些不通用的包,maven仓库没有,只能通过本地包依赖,就像下面方式: 在需要依赖的项目建lib文件夹,如下: 然后在pom.xml项目管理文件里面加入本地依赖,如下 这种情 ...

  8. Compass 更智能的搜索引擎(1)--入门

    学完了前面的Lucene系列教程: 全文检索 Lucene(1)–入门 全文检索 Lucene(2)–进阶 全文检索 Lucene(3)–分页 全文检索 Lucene(4)–高亮 Lucene确实是个 ...

  9. 有N个数,组成的字符串,如012345,求出字串和取MOD3==0的子串,如012 12 123 45。

    #include <iostream> using namespace std; int getSum(string str, int begin, int len) { int sum ...

  10. Android 5.1 添加硬件抽象层(HAL)和JNI接口总结

    点击打开链接