Router和History (路由控制)
Backbone.Router担任了一部分Controller(控制器)的工作,它一般运行在单页应用中,能将特定的URL或锚点规则绑定到一个指定的方法(后文中称Action)。
当我们开发一个单页应用时,常常会遇到这样两个问题:
我们在同一个页面中通过用户的操作来隐藏、显示HTML块,为用户提供一个无刷新、完整流畅的体验,但用户可能并不知道他当前正处于同一个页面中,因此他希望通过浏览器的“前进”和“后退”按钮来返回和前进到上一步操作。当他真正这样操作时,会离开当前页面,这显然不是用户所期望的。
另一个问题是用户在单页应用中操作,当他读到一篇好的文章,或看到一个中意的商品时,他可能会将URL收藏起来或分享给自己的好友。但当他下一次重新打开这个链接地址,看到的却是应用的初始化状态,而并不是当初那篇文章或那个商品。
Backbone.Router为我们提供了解决这两个问题的方法,我们先来看一个例子:
- var AppRouter = Backbone.Router.extend({
- routes : {
- '' : 'main',
- 'topic' : 'renderList',
- 'topic/:id' : 'renderDetail',
- '*error' : 'renderError'
- },
- main : function() {
- console.log('应用入口方法');
- },
- renderList : function() {
- console.log('渲染列表方法');
- },
- renderDetail : function(id) {
- console.log('渲染详情方法, id为: ' + id);
- },
- renderError : function(error) {
- console.log('URL错误, 错误信息: ' + error);
- }
- });
- var router = new AppRouter();
- Backbone.history.start();
上述例子请在页面ready 以后执行,否则复杂用过url 路由到actions
将例子中的代码复制到你的页面中。假设你的页面地址为http://localhost/index.html,请依次访问下面的地址,并注意控制台的输出结果:
- http://localhost/index.html // 输出:应用入口方法
- http://localhost/index.html#topic // 输出:渲染列表方法
- http://localhost/index.html#topic/1023 // 输出:渲染详情方法, id为:1023
- http://localhost/index.html#about // 输出:URL错误, 错误信息: about
然后再使用浏览器的“前进”、“返回”等按钮进行切换,你会看到当你的URL切换时,控制台输出了对应的结果,说明它已经调用了相应的方法。而在进行这些操时,页面并没有刷新。这个例子很好地解决了我们在一开始所说的两个问题。
10.1 路由规则设定
你可能经常听说“路由器”这个词,但它常常是指一种网络设备,这种设备是网络连接、数据传输的导航和枢纽。而Backbone中的“路由器”功能与它类似,从上面的例子中你就能看出,它可以将不同的URL锚点导航到对应的Action方法。
(许多服务端Web框架中也提供了这样的机制,但Backbone.Router更侧重前端单页应用的导航。)
Backbone的路由导航是由Backbone.Router和Backbone.History两个类共同完成的:
Router类用于定义和解析路由规则,并将URL映射到Action。
History类用于监听URL的变化,和触发Action方法。
我们一般不会直接实例化一个History,因为我们在第一次创建Router实例时,会自动创建一个History的单例对象,你可以通过Backbone.history来访问这个对象。
要使用路由功能,首先我们需要定义一个Router类来声明需要监听的URL规则和Action,在刚才的例子中,我们在定义时通过routes属性来定义需要监听的URL列表,其中Key表示URL规则,Value表示当URL处于该规则时所执行的Action方法。
10.2 Hash规则
URL规则表示当前URL中的Hash(锚点)片段,我们除了能在规则中指定一般的字符串外,还需要注意两种特别的动态规则:
规则中以/(斜线)为分隔的一段字符串,在Router类内部会被转换为表达式([^\/]+),表示以/(斜线)开头的多个字符,如果在这一段规则中设置了:(冒号),则表示URL中这一段字符串将被作为参数传递给Action。
例如我们设置了规则topic/:id,当锚点为#topic/1023时,1023将被作为参数id传递给Action,规则中的参数名(:id)一般会和Action方法的形参名称相同,虽然Router并没有这样的限制,但使用相同的参数名更容易让人理解。
规则中的*(星号)会在Router内部被转换为表达式(.*?),表示零个或多个任意字符,与:(冒号)规则相比,*(星号)没有/(斜线)分隔的限制,就像我们在上面的例子中定义的*error规则一样。
Router中的*(星号)规则在被转换为正则表达式后使用非贪婪模式,因此你可以使用例如这样的组合规则:*type/:id,它能匹配#hot/1023,同时会将hot和1023作为参数传递给Action方法。
上面介绍了规则的定义方式,这些规则都会对应一个Action方法名称,该方法必须处于Router对象中。
在定义好Router类之后,我们需要实例化一个Router对象,并调用Backbone.history对象的start()方法,该方法会启动对URL的监听。在History对象内部,默认会通过onhashchange事件监听URL中Hash(锚点)的变化,对于不支持onhashchange事件的浏览器(例如IE6),History会通过setInterval心跳的方式监听。
10.3 pushState规则
Backbone.History还支持pushState方式的URL,pushState是HTML5提供的一种新特性,它能操作当前浏览器的URL(而不是仅仅改变锚点),同时不会导致页面刷新,从而使单页应用使用起来更像一套完整的流程。
要使用pushState特性,你需要先了解HTML5为该特性提供的一些方法和事件(这些方法都被定义在window.history对象中):
- pushState():该方法可以将指定的URL添加一个新的history实体到浏览器历史里
- replaceState():该方法可以将当前的history实体替换为指定的URL
调用pushState()和replaceState()方法,仅仅是替换当前页面的URL,而并不会真正转到这个URL地址(当使用后退或前进按钮时,也不会跳转到该URL),我们可以通过onpopstate事件来监听这两个方法引起的URL变化。
值得注意的是,使用pushState特性时,需要在服务器端对URL规则进行配置,否则用户在下一次访问该地址时,可能无法正确导航到当前页面。另外低于以下版本的浏览器是不支持该特性的:Chrome 5,Firefox 4.0,IE 10,Opera 11.5,Safari 5.0
关于pushState规则这里不再深入讨论,如果需要了解,请参考我所注释的Backbone源码。
10.4 路由相关方法
route()方法
在设定好路由规则之后,如果需要动态调整,可以调用Router.route()方法来动态添加路由规则及Action方法,例如:
- router.route('topic/:pageno/:pagesize', 'page', function(pageno, pagesize){
- // todo
- });
我们调用route()方法时,给定的规则不仅仅可以是字符串,也可以是一个正则表达式:
- router.route(/^topic/(.*?)/(.*?)$/, 'page', function(pageno, pagesize){
- // todo
- });
navigate()方法
在前面的例子中,URL规则都是由我们手动输入触发的,在实际应用中,有时可能需要手动进行跳转、导航,这时可以调用Router.navigate()方法进行控制,例如:
- router.navigate('topic/1000', {
- trigger: true
- });
这段代码将URL更改为http://localhost/index.html#topic/1000,并触发了renderDetail方法。需要注意的是,我们在第二个参数传入了trigger配置,该配置用于表示更改URL的同时是否触发相应的Action方法。
stop()方法
还记得我们是通过Backbone.history.start()方法来启动路由监听的,你也可以随时调用Backbone.history.stop()方法来停止监听,例如:
- router.route('topic/:pageno/:pagesize', 'page', function(pageno, pagesize) {
- Backbone.history.stop();
- });
运行这段代码,并访问URL:http://localhost/index.html#topic/5/20,你会发现这个Action被执行之后,监听已经不再生效了。
相关推荐
通过阅读这份文档,你可以了解如何创建模型、视图、集合和路由器,以及如何使用Backbone.history和Backbone.sync等辅助工具。文档中还包括了大量的示例代码,帮助你快速上手并掌握Backbone.js的核心概念。 总之,...
Backbone中文API文档是为了解决中文开发者在使用过程中语言障碍的问题,提供了详尽的中文解释和示例。 1. **模型(Model)**: 在Backbone中,模型是数据的容器,通常对应于后端服务器的数据模型。模型拥有属性和方法...
发现Backbone中View和Model的直接通信在比较麻烦,少量还可以看出来,如果后期model和view频繁交换数据。那就需要一个托管两者事件的层来做这个工作。我这里命名为controller。 文章见web前端中的demo1.
1. **Model**:Backbone中的模型是应用的核心,负责存储和处理数据。它们与服务器上的数据源进行交互,通过`fetch`和`save`方法来获取和更新数据。模型还支持事件监听,当数据发生变化时,可以触发相应的事件。 2. ...
Router是Backbone中的路由组件,它允许你通过哈希片段(hashbangs)或者HTML5 History API来控制应用程序的导航。通过定义路由模式,你可以将URL路径映射到特定的函数,实现页面无刷新的切换。 在实际开发中,...
Backbone.js API中文文档,供有需要的伙伴们使用。 Backbone.js API中文文档,供有需要的伙伴们使用。 Backbone.js API中文文档,供有需要的伙伴们使用。
在"Backbone 和 Bootstrap 登录示例项目"中,我们将学习以下关键知识点: 1. **Backbone.Model和Backbone.View** - **Backbone.Model**:在这个登录示例中,Model可能包含用户名和密码属性,用于存储用户的登录...
Backbone.js 和 Underscore.js 是两个在JavaScript开发中广泛使用的库,它们为构建复杂的Web应用程序提供了强大的工具。这两个库都是基于jQuery库,其中jQuery-1.10.2.js是jQuery的一个版本,它为DOM操作、事件处理...
在实例应用中,我们可以通过以下步骤学习和使用Backbone: 1. 创建Model,定义数据结构和验证规则。 2. 创建View,绑定到Model,并处理DOM事件。 3. 定义Router,根据URL变化执行相应操作。 4. 创建Collection,...
Backbone.js 建立在 jQuery 和 Underscore.js 之上,因此它可以无缝集成到已经使用这些库的项目中。此外,它还支持通过 RESTful JSON 接口与服务器通信,使得前后端之间的数据交换更加高效。 #### 二、通过 Hello...
Backbone.js的View视图主要负责绑定和处理DOM事件,它还可以用来反映你应用程序中Model的模样。Backbone.js的视图不仅处理数据的显示,还要响应用户的交互事件。 在Backbone.js中,视图组件可以通过两种方式定义:...
《backbone.js应用程序开发》先从了解mvc、spa和backbone的基本知识开始,然后着手构建示例应用程序——一个简单的todo列表应用程序、restful风格的图书应用程序、以及使用backbone和requirejs的模块化应用程序。...
在本文中,我们将深入探讨如何使用Node.js构建应用程序,并结合MongoDB数据库以及Backbone.js作为前端框架,实现数据的高效管理和交互。Node.js是基于Chrome V8引擎的JavaScript运行环境,它让JavaScript能够运行在...
backbone-book, 在 backbone.js 和JS应用模式和最佳实践上,手册 backbone.js-应用程序的实用指南关于 backbone.js 和JS应用模式和最佳实践的小册子。勘误和想法使用请求提交勘误表。 如果它是小的东西 Twitter 会做...
在IT行业中,Backbone.js是一个非常著名的JavaScript库,它主要用于构建客户端的Web应用程序。这个"Java演示Backbone基本用法"的主题,虽然标题中有"Java",但实际上Backbone.js是与JavaScript紧密相关的,而非Java...
6. **Backbone.js的Model和Collection**:了解如何将MongoDB中的文档映射到Backbone.js的Model,以及如何使用Collection管理一组Model,实现数据的同步和异步操作。 7. **Backbone.js的View和Router**:学习如何...
8. **初始化与实例化**:在实际应用中,你需要创建Backbone对象的实例,比如`new Backbone.Model()`或`new Backbone.View()`,并设置相应的属性和事件监听。同时,你还需要设置全局的Backbone.history.start()来启动...
你可以看到如何在Backbone中定义数据模型,设置模型的属性和监听器,以及如何创建视图并绑定事件。此外,还可能包含了应用的初始化代码,比如加载数据或者设置路由。 "backbone-localstorage.js"是Backbone的一个...