原文: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. iOS 购物—个人中心界面

    上一个QQ界面真实无心插柳,想不到一个新手的普通界面可以上首页推荐,在这谢谢那些csdn工作者对新手的支持,谢谢soledadzz  的特别推荐: 以下这个界面也是师傅锻炼我的题目主要是让我熟悉tab ...

  2. 使用LabVIEWPC的制备

    使用LabVIEWPC的制备 1.下载.安装LabVIEW 如今,互联网搜索,你可以搜索出一大推LabVIEW下载并安装破解教程.因此,这里没有具体描述的.请自行百度~~.另外.提醒一下,下载LabV ...

  3. linux下Ftp环境的搭建

      Ftp环境的搭建 1.ftp软件的安装 使用ssh远程连接linux系统,上传和下载一些文件,Ftp是不可少的 Ftp的安装很简单,远程登录系统后使用命令 yum list vsftpd 通过提示 ...

  4. RedGate 工具SQLMultiScript1.1

    原文:RedGate 工具SQLMultiScript1.1 RedGate 工具SQLMultiScript1.1 SQLMultiScript是一个脚本分发工具,当你写好了一个SQL脚本之后,你需 ...

  5. 深入了解回调函数Java

    打回来.我第一次看到Java编程思想,后来Observer模式也适用于一个回调函数的想法.但是,一直没有重视,在处于劣势的最终面试,越来越明白为什么那么多人说Java编程思想,这本书应该是一遍又一遍, ...

  6. php:修改NetBeans默认字体

    在Netbeans中由于使用了Swing进行开发,所以其中界面的字体也是由Java虚拟机进行配置而不是随操作系统的.在安装完Netbeans后默认的字体大小是11px.而在Windows下的宋体最小支 ...

  7. Java进阶 创建和销毁对象

    最近准备写点Javase的东西,希望可以帮助大家写出更好的代码. 1.给不可实例化的类提供私有构造器 比如:每个项目中都有很多工具类,提供了很多static类型的方法供大家使用,谁也不希望看到下面的代 ...

  8. 在struts2中訪问servletAPI

    在struts2中訪问servletAPI,通俗点也就是使用servlet中的两个对象request对象和response对象. 前几天看到一个CRM项目的源代码,里面使用request对象和resp ...

  9. [JSP][JSTL]页面调用函数--它${fn:}内置函数、是推断字符串是空的、更换车厢

    页面中调用函数--之${fn:}内置函数 函数描写叙述 fn:contains(string, substring) 假设參数string中包括參数substring,返回true fn:contai ...

  10. python K-means工具包初解

    近期数据挖掘实验,写个K-means算法,写完也不是非常难,写的过程中想到python肯定有包,尽管师兄说不让用,只是自己也写完了,而用包的话,还不是非常熟,略微查找了下资料,学了下.另外,自己本身写 ...