`
zha_zi
  • 浏览: 593180 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

backbone中的 reuter 和histroy

 
阅读更多

Router和History (路由控制)

  Backbone.Router担任了一部分Controller(控制器)的工作,它一般运行在单页应用中,能将特定的URL或锚点规则绑定到一个指定的方法(后文中称Action)。

  当我们开发一个单页应用时,常常会遇到这样两个问题:

  我们在同一个页面中通过用户的操作来隐藏、显示HTML块,为用户提供一个无刷新、完整流畅的体验,但用户可能并不知道他当前正处于同一个页面中,因此他希望通过浏览器的“前进”和“后退”按钮来返回和前进到上一步操作。当他真正这样操作时,会离开当前页面,这显然不是用户所期望的。

  另一个问题是用户在单页应用中操作,当他读到一篇好的文章,或看到一个中意的商品时,他可能会将URL收藏起来或分享给自己的好友。但当他下一次重新打开这个链接地址,看到的却是应用的初始化状态,而并不是当初那篇文章或那个商品。

 

  Backbone.Router为我们提供了解决这两个问题的方法,我们先来看一个例子:

 

Js代码   收藏代码
  1. var AppRouter = Backbone.Router.extend({  
  2.     routes : {  
  3.         '' : 'main',  
  4.         'topic' : 'renderList',  
  5.         'topic/:id' : 'renderDetail',  
  6.         '*error' : 'renderError'  
  7.     },  
  8.     main : function() {  
  9.         console.log('应用入口方法');  
  10.     },  
  11.     renderList : function() {  
  12.         console.log('渲染列表方法');  
  13.     },  
  14.     renderDetail : function(id) {  
  15.         console.log('渲染详情方法, id为: ' + id);  
  16.     },  
  17.     renderError : function(error) {  
  18.         console.log('URL错误, 错误信息: ' + error);  
  19.     }  
  20. });  
  21.   
  22. var router = new AppRouter();  
  23. 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方法,例如:

 

Js代码   收藏代码
  1. router.route('topic/:pageno/:pagesize''page'function(pageno, pagesize){  
  2.     // todo  
  3. });  

 

 

  我们调用route()方法时,给定的规则不仅仅可以是字符串,也可以是一个正则表达式:

 

Js代码   收藏代码
  1. router.route(/^topic/(.*?)/(.*?)$/, 'page'function(pageno, pagesize){  
  2.     // todo  
  3. });  

 

 

 

  navigate()方法

  在前面的例子中,URL规则都是由我们手动输入触发的,在实际应用中,有时可能需要手动进行跳转、导航,这时可以调用Router.navigate()方法进行控制,例如:

 

Js代码   收藏代码
  1. router.navigate('topic/1000', {  
  2.     trigger: true  
  3. });  

 

 

  这段代码将URL更改为http://localhost/index.html#topic/1000,并触发了renderDetail方法。需要注意的是,我们在第二个参数传入了trigger配置,该配置用于表示更改URL的同时是否触发相应的Action方法。

 

  stop()方法

  还记得我们是通过Backbone.history.start()方法来启动路由监听的,你也可以随时调用Backbone.history.stop()方法来停止监听,例如:

 

Js代码   收藏代码
  1. router.route('topic/:pageno/:pagesize''page'function(pageno, pagesize) {  
  2.     Backbone.history.stop();  
  3. });  

 

 

  运行这段代码,并访问URL:http://localhost/index.html#topic/5/20,你会发现这个Action被执行之后,监听已经不再生效了。

分享到:
评论

相关推荐

    Backbone.js(1.1.2) API中文文档.zip Backbone.js离线文档

    通过阅读这份文档,你可以了解如何创建模型、视图、集合和路由器,以及如何使用Backbone.history和Backbone.sync等辅助工具。文档中还包括了大量的示例代码,帮助你快速上手并掌握Backbone.js的核心概念。 总之,...

    backbone中文api

    Backbone中文API文档是为了解决中文开发者在使用过程中语言障碍的问题,提供了详尽的中文解释和示例。 1. **模型(Model)**: 在Backbone中,模型是数据的容器,通常对应于后端服务器的数据模型。模型拥有属性和方法...

    Backbone中view和model事件托管

    发现Backbone中View和Model的直接通信在比较麻烦,少量还可以看出来,如果后期model和view频繁交换数据。那就需要一个托管两者事件的层来做这个工作。我这里命名为controller。 文章见web前端中的demo1.

    BackBone介绍及使用

    1. **Model**:Backbone中的模型是应用的核心,负责存储和处理数据。它们与服务器上的数据源进行交互,通过`fetch`和`save`方法来获取和更新数据。模型还支持事件监听,当数据发生变化时,可以触发相应的事件。 2. ...

    backbone 资料

    Router是Backbone中的路由组件,它允许你通过哈希片段(hashbangs)或者HTML5 History API来控制应用程序的导航。通过定义路由模式,你可以将URL路径映射到特定的函数,实现页面无刷新的切换。 在实际开发中,...

    Backbone.js API中文文档

    Backbone.js API中文文档,供有需要的伙伴们使用。 Backbone.js API中文文档,供有需要的伙伴们使用。 Backbone.js API中文文档,供有需要的伙伴们使用。

    backbone 和bootstrap 登录示例项目

    在"Backbone 和 Bootstrap 登录示例项目"中,我们将学习以下关键知识点: 1. **Backbone.Model和Backbone.View** - **Backbone.Model**:在这个登录示例中,Model可能包含用户名和密码属性,用于存储用户的登录...

    backbone.js underscore.js

    Backbone.js 和 Underscore.js 是两个在JavaScript开发中广泛使用的库,它们为构建复杂的Web应用程序提供了强大的工具。这两个库都是基于jQuery库,其中jQuery-1.10.2.js是jQuery的一个版本,它为DOM操作、事件处理...

    backbone框架在实例中的应用~简单易学

    在实例应用中,我们可以通过以下步骤学习和使用Backbone: 1. 创建Model,定义数据结构和验证规则。 2. 创建View,绑定到Model,并处理DOM事件。 3. 定义Router,根据URL变化执行相应操作。 4. 创建Collection,...

    backbone.js入门教程

    Backbone.js 建立在 jQuery 和 Underscore.js 之上,因此它可以无缝集成到已经使用这些库的项目中。此外,它还支持通过 RESTful JSON 接口与服务器通信,使得前后端之间的数据交换更加高效。 #### 二、通过 Hello...

    实例讲解JavaScript的Backbone.js框架中的View视图

    Backbone.js的View视图主要负责绑定和处理DOM事件,它还可以用来反映你应用程序中Model的模样。Backbone.js的视图不仅处理数据的显示,还要响应用户的交互事件。 在Backbone.js中,视图组件可以通过两种方式定义:...

    Backbone.js应用程序开发 中文清晰完整版pdf

    《backbone.js应用程序开发》先从了解mvc、spa和backbone的基本知识开始,然后着手构建示例应用程序——一个简单的todo列表应用程序、restful风格的图书应用程序、以及使用backbone和requirejs的模块化应用程序。...

    Node应用程序构建——使用MongoDB和Backbone

    在本文中,我们将深入探讨如何使用Node.js构建应用程序,并结合MongoDB数据库以及Backbone.js作为前端框架,实现数据的高效管理和交互。Node.js是基于Chrome V8引擎的JavaScript运行环境,它让JavaScript能够运行在...

    backbone-book, 在 backbone.js 和JS应用模式和最佳实践上,手册.zip

    backbone-book, 在 backbone.js 和JS应用模式和最佳实践上,手册 backbone.js-应用程序的实用指南关于 backbone.js 和JS应用模式和最佳实践的小册子。勘误和想法使用请求提交勘误表。 如果它是小的东西 Twitter 会做...

    Java 演示 backbone 基本用法

    在IT行业中,Backbone.js是一个非常著名的JavaScript库,它主要用于构建客户端的Web应用程序。这个"Java演示Backbone基本用法"的主题,虽然标题中有"Java",但实际上Backbone.js是与JavaScript紧密相关的,而非Java...

    《Node应用程序构建:使用MongoDB和Backbone》 源码

    6. **Backbone.js的Model和Collection**:了解如何将MongoDB中的文档映射到Backbone.js的Model,以及如何使用Collection管理一组Model,实现数据的同步和异步操作。 7. **Backbone.js的View和Router**:学习如何...

    backbone学习例子-可编辑的表格

    8. **初始化与实例化**:在实际应用中,你需要创建Backbone对象的实例,比如`new Backbone.Model()`或`new Backbone.View()`,并设置相应的属性和事件监听。同时,你还需要设置全局的Backbone.history.start()来启动...

    Backbone 文档

    你可以看到如何在Backbone中定义数据模型,设置模型的属性和监听器,以及如何创建视图并绑定事件。此外,还可能包含了应用的初始化代码,比如加载数据或者设置路由。 "backbone-localstorage.js"是Backbone的一个...

Global site tag (gtag.js) - Google Analytics