(六)backbone - API学习 - Backbone路由

Backbone路由本质

Backbone路由分为两个大块,Router以及History
用户在Router中定义相关规则,然后开启history.start进行路由监控,执行默认的回调
所以,Router本身除了定义路由规则,全部调用的是Backbone.history的方法
Backbone.History的主要关注点事实上是 popstate(hashChange)的回调checkUrl,无论我们触发navigate或者点击浏览器后退
皆是进入此入口,再回调至Router定义的回调,从而实现相关逻辑

•创建规则

 1 var App = Backbone.Router.extend({
 2     routes: {
 3       "": "index",    // #index
 4       "index": "index",    // #index
 5       "detail": "detail"    // #detail
 6     },
 7     index: function () {
 8       var index = new Index(this.interface);
 9
10    },
11    detail: function () {
12      var detail = new Detail(this.interface);
13
14    },
15    initialize: function () {
16
17    },
18    interface: {
19      forward: function (url) {
20        window.location.href = (‘#‘ + url).replace(/^#+/, ‘#‘);
21      }
22
23    }
24 });

•开启路由控制

Backbone.history.start();

Backbone.history源码分析

history构造函数

 1 var History = Backbone.History = function () {
 2   this.handlers = [];
 3   _.bindAll(this, ‘checkUrl‘);
 4
 5   // Ensure that `History` can be used outside of the browser.
 6   if (typeof window !== ‘undefined‘) {
 7     this.location = window.location;
 8     this.history = window.history;
 9   }
10 };

history.start 函数

 1 start: function(options) {
 2       if (History.started) throw new Error("Backbone.history has already been started");
 3       History.started = true;
 4
 5       // Figure out the initial configuration. Do we need an iframe?
 6       // Is pushState desired ... is it available?
 7       this.options          = _.extend({root: ‘/‘}, this.options, options);
 8       this.root             = this.options.root;
 9       this._wantsHashChange = this.options.hashChange !== false;
10       this._wantsPushState  = !!this.options.pushState;
11       this._hasPushState    = !!(this.options.pushState && this.history && this.history.pushState);
12       var fragment          = this.getFragment();
13       var docMode           = document.documentMode;
14       var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));
15
16       // Normalize root to always include a leading and trailing slash.
17       this.root = (‘/‘ + this.root + ‘/‘).replace(rootStripper, ‘/‘);
18
19       // 老版本ie以及希望使用hashChange, 使用iframe实现
20       if (oldIE && this._wantsHashChange) {
21         var frame = Backbone.$(‘<iframe src="javascript:0" tabindex="-1">‘);
22         this.iframe = frame.hide().appendTo(‘body‘)[0].contentWindow;
23         this.navigate(fragment);
24       }
25
26       // Depending on whether we‘re using pushState or hashes, and whether
27       // ‘onhashchange‘ is supported, determine how we check the URL state.
28       if (this._hasPushState) {
29         Backbone.$(window).on(‘popstate‘, this.checkUrl);
30       } else if (this._wantsHashChange && (‘onhashchange‘ in window) && !oldIE) {
31         Backbone.$(window).on(‘hashchange‘, this.checkUrl);
32       } else if (this._wantsHashChange) {
33         this._checkUrlInterval = setInterval(this.checkUrl, this.interval);
34       }              /* 取决于选择hash还是pushState        如果使用 pushState,调用方法           Backbone.history.start({ pushState: true });           */
35
36       // Determine if we need to change the base url, for a pushState link
37       // opened by a non-pushState browser.
38       this.fragment = fragment;
39       var loc = this.location;
40
41       // Transition from hashChange to pushState or vice versa if both are
42       // requested.
43       if (this._wantsHashChange && this._wantsPushState) {
44
45         // If we‘ve started off with a route from a `pushState`-enabled
46         // browser, but we‘re currently in a browser that doesn‘t support it...
47         if (!this._hasPushState && !this.atRoot()) {
48           this.fragment = this.getFragment(null, true);
49           this.location.replace(this.root + ‘#‘ + this.fragment);
50           // Return immediately as browser will do redirect to new url
51           return true;
52
53         // Or if we‘ve started out with a hash-based route, but we‘re currently
54         // in a browser where it could be `pushState`-based instead...
55         } else if (this._hasPushState && this.atRoot() && loc.hash) {
56           this.fragment = this.getHash().replace(routeStripper, ‘‘);
57           this.history.replaceState({}, document.title, this.root + this.fragment);
58         }
59
60       }
61
62       if (!this.options.silent) return this.loadUrl();
63     }

统一入口 loadUrl

loadUrl: function (fragmentOverride) {
  var fragment = this.fragment = this.getFragment(fragmentOverride);
  var matched = _.any(this.handlers, function (handler) {      // handlers是routes定义的集合,实例化Router时导入
    if (handler.route.test(fragment)) {
      handler.callback(fragment);
      return true;
    }
  });
  return matched;
}
时间: 2024-08-29 15:47:29

(六)backbone - API学习 - Backbone路由的相关文章

【转】Backbone.js学习笔记(一)

文章转自: http://segmentfault.com/a/1190000002386651 基本概念 前言 昨天开始学Backbone.js,写篇笔记记录一下吧,一直对MVC模式挺好奇的,也对js中MVC的开创鼻祖怀着敬畏之心,唉,不说了,好虚伪,以下是我的学习心得和笔记. 给大家看一下全球js库和框架的使用比例:这是通过搜索引擎抓取script标签统计而来的数据,可信度相当高啊,另外,不要迷恋Angular.js,Avalon.js还是挺不错的. 什么是Backbone.js? Back

开始学习 Backbone

[转]开始学习 Backbone 如何将模型-视图-控制器 (MVC) 架构引入 Ajax Web 应用程序 如何高效管理 Web 应用程序中的数目众多的 JavaScript 代码行是一个挑战.Asynchronous JavaScript and XML (Ajax) 交互大量充斥着各种页面,为用户提供了更好体验.越来越普遍的单页界面均由 Ajax 驱动.Backbone 是一个 JavaScript 框架,可用于创建模型-视图-控制器 (model-view-controller, MVC

【转】Backbone.js学习笔记(二)细说MVC

文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Backbone源码结构 1: (function() { 2: Backbone.Events // 自定义事件 3: Backbone.Model // 模型构造函数和原型扩展 4: Backbone.Collection // 集合构造函数和原型扩展 5: Backbone.Router // 路由

野兽的Angular Api 学习、翻译及理解 - - ngRoute Angular自带的路由

野兽的ng api学习 -- ngRoute ngRoute $routeProvider 配置路由的时候使用. 方法: when(path,route); 在$route服务里添加一个新的路由. path:该路由的路径. route:路由映射信息. controller:字符串或函数,指定控制器. controllerAs:一个用于控制器的标识符名称.. template:字符串或函数,html模板. templateUrl:字符串或函数,html模板的地址. resolve:对象,一个可选的

Backbone事件管理——Backbone.Events模块API结构

模块Backbone.Events的事件管理是通过Backbone提供的Events API来实现的,该API在1.0版本之前仅仅提供了几个基本的方法,如on.off.trigger.once分别执行对事件的绑定.解除绑定.执行事件.执行一次事件的操作.从1.0版本以后,又添加了几个实用方法,如listenTo.listenToOnce.stopListening,分别执行添加一个事件的侦察对象.添加一个仅执行一次的事件侦察对象和移除已添加的事件侦察对象,其完整的结构如图3-1所示. Backb

Backbone.js学习之二

经历一段自我修炼,终于领悟到Backbone.js的关键知识点,也发现了原来MVC可以在前端这样梦幻的发挥,Backbone.js确实是一个很有魅力的前端MVC框架. 练就一门技术,需要有扎实的功底,从这点,开始认真研究Backbone.js的一些最基本的操作,以便我日后学习能更上一层楼.那就切入主题: 什么是mvc? 简单的理解就是:模型(models),视图(views),控制器(collections).通过视图把浏览器的网址传给控制器,控制器对网址进行解析,然后去模型层获取数据,模型层将

backbone入门学习一

初识backbone 1.Backbone是什么? Backbone是一个非常轻量级的javaScript库,可以打造为模型(Model)-视图(View)-控制器(Controller)即MVC类结构的应用程序. 2.Backbone能干什么? 通过这种结构能够有组织的分门别类的管理Web应用程序中纷乱复杂的JavaScript代码,以及处理单页界面(SPI)中含有大量复杂的AJAX交互请求. 3.Backbone的MVC架构 数据模型(Model)负责数据原型的创建和各类事件的自定义,并通过

Backbone.js学习之一

昨天一个我崇拜的朋友,徐飞送我一本名为<Backbone.js实战>书,让我心中狂喜,于是带着这份浓厚的兴趣,开始研究Backbone.js之路. 打开这本书的第一句话就很有哲理,“授人以鱼,不如授之以渔.”,我花了一段时间仔细的看完了的第一章节,今天通过自己所理解的, 记录下我自学的第一步.其他不多说,进入主题: 首先在学习Backbone.js之前要了解Backbone.js是什么? 在我看来它是一个处理前端MVC很好的js框架,Backbone是一个非常轻量级的javascript库,自

SPA学习之 - 路由插件(crossroads.js)

Crossroads.js是一个受Rails, Pyramid, Django, CakePHP等基于路由/分发(Route/Dispatch)方式处理路由的后端MVC框架启发的一套js专业路由库.它能够直接解析传入的字符串并根据相应的规则来过滤和验证路由,然后再执行下一步的操作. A duck can walk, fly and swim, but he can’t do any of these things well… crossroads.js是一个独立的库功能十分强大和灵活,而且职责单