原文:How to Use Routing in Your Ext JS 5 Apps

简单介绍

Ext JS 5是一个重要的公布版本号,它提供了很多新特性来创建丰富的、企业级的Web应用程序。MVVM和双向数据绑定为开发者承担了大量的繁重工作。在Ext JS 5种,还有一个新特性就是路由,它能够在控制器内轻松的管理历史记录。前进和后退button是每个浏览器都会拥有的公共用户接口,如今,使用Ext JS 5在单页面应用程序中处理导航变得相当简单了。

Ext JS 5路由

在Ext JS,已经能够使用Ext.util.Histroy类来处理历史记录的变化,但在Ext JS 5,这个处理变得更easy和灵活。路由提供了一种更易于配置的方式来将散列值映射到控制器的方法,这包括使用參数和之前的行为来控制路由运行的流程,而在后端则使用Ext.util.History来处理。下面来看一个简单的样例:

    Ext.define('MyApp.controller.Main', {
extend : 'Ext.app.Controller', routes : {
'home' : 'onHome'
}, onHome : function() {}
});

在路由对象中,keyword“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应用程序.MVVM和双 ...

  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. EXE文件结构和读取方法

    一.EXE文件概念 EXE File英文全名executable file .译作可运行文件,可移植可运行 (PE) 文件格式的文件,它能够载入到内存中.并由操作系统载入程序运行,是可在操作系统存储空 ...

  2. C++ 建设者继承

    微通道公用号CodingRush 分享编程.算法.机器人leanring.数据挖掘.推荐系统.知识大数据计算框架,欢迎扫码关注. 子类继承了哪些东西? 子类在继承父类的时候,父类的public成员变量 ...

  3. Memcached FAQ

    这篇FAQ包含了大家普遍关心的问题.非常值得一看. 原文:http://blog.csdn.net/jarfield/archive/2009/07/05/4322953.aspx 最后更新时间 20 ...

  4. Android更改checkbox的style

    resouce文件夹下,value文件夹下,styles.xml文件中新增样式: <resources> <style name="radioButton"> ...

  5. 点击搜索取消UISearchDisplayController的搜索状态

    一般,我们用到UISearchDisplayController的时候,都是须要对一个数据源进行刷选,在UISearchDisplayController自带的tableView中展示出来,然后点击退 ...

  6. JavaScript概要

     当用户填写表单在线,用户输入表单经常要推测在页面上,它提示用户填写正确的邮箱.哪些项目不填之类,这些都是JavaScript小的特点. JavaScript是一种基于对象的脚本语言,使用它能够开 ...

  7. UI标签库的话题:JEECG智能开发平台 BaseTag(样式表和JS标签的引入)

    UI标签库专题一:JEECG智能开发平台 BaseTag(样式表和JS引入标签) 1.BaseTag(样式表和JS引入标签) 1.1. 演示样例 <t:base type="jquer ...

  8. UVALive 5103 Computer Virus on Planet Pandora Description 一些新兴需求模式的字符串 AC自己主动机

    主题链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=3104">点击打开链接 题意: ...

  9. C#如何获得 WINDOWS 版本号

    using System; using System.Runtime.InteropServices; namespace GetWindowsVersion { [ StructLayout( La ...

  10. 【转】Directx11 HelloWorld之HLSL的Effect框架的使用

    最近尝试用了下Directx下的Effect框架,作为一初学者初学者,说下为什么我们要使用Effect框架及其好处吧. 首先Effect最大好处的就是简单,使得编写Shader绘制的程序工作量大大下降 ...