(六)backbone - API学习 - Backbone路由
Backbone路由本质
Backbone路由分为两个大块,Router以及History
用户在Router中定义相关规则,然后开启history.start进行路由监控,执行默认的回调
所以,Router本身除了定义路由规则,全部调用的是Backbone.history的方法
Backbone.History的主要关注点事实上是 popstate(hashChange)的回调checkUrl,无论我们触发navigate或者点击浏览器后退
皆是进入此入口,再回调至Router定义的回调,从而实现相关逻辑
•创建规则
 var App = Backbone.Router.extend({
     routes: {
       "": "index",    // #index
       "index": "index",    // #index
       "detail": "detail"    // #detail
     },
     index: function () {
       var index = new Index(this.interface);
    },
    detail: function () {
      var detail = new Detail(this.interface);
    },
    initialize: function () {
    },
    interface: {
      forward: function (url) {
        window.location.href = ('#' + url).replace(/^#+/, '#');
      }
    }
 });
•开启路由控制
Backbone.history.start();
Backbone.history源码分析
history构造函数
 var History = Backbone.History = function () {
   this.handlers = [];
   _.bindAll(this, 'checkUrl');
   // Ensure that `History` can be used outside of the browser.
   if (typeof window !== 'undefined') {
     this.location = window.location;
     this.history = window.history;
   }
 };
history.start 函数
 start: function(options) {
       if (History.started) throw new Error("Backbone.history has already been started");
       History.started = true;
       // Figure out the initial configuration. Do we need an iframe?
       // Is pushState desired ... is it available?
       this.options          = _.extend({root: '/'}, this.options, options);
       this.root             = this.options.root;
       this._wantsHashChange = this.options.hashChange !== false;
       this._wantsPushState  = !!this.options.pushState;
       this._hasPushState    = !!(this.options.pushState && this.history && this.history.pushState);
       var fragment          = this.getFragment();
       var docMode           = document.documentMode;
       var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));
       // Normalize root to always include a leading and trailing slash.
       this.root = ('/' + this.root + '/').replace(rootStripper, '/');
       // 老版本ie以及希望使用hashChange, 使用iframe实现
       if (oldIE && this._wantsHashChange) {
         var frame = Backbone.$('<iframe src="javascript:0" tabindex="-1">');
         this.iframe = frame.hide().appendTo('body')[0].contentWindow;
         this.navigate(fragment);
       }
       // Depending on whether we're using pushState or hashes, and whether
       // 'onhashchange' is supported, determine how we check the URL state.
       if (this._hasPushState) {
         Backbone.$(window).on('popstate', this.checkUrl);
       } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {
         Backbone.$(window).on('hashchange', this.checkUrl);
       } else if (this._wantsHashChange) {
         this._checkUrlInterval = setInterval(this.checkUrl, this.interval);
       }   
           /* 取决于选择hash还是pushState 
       如果使用 pushState,调用方法
           Backbone.history.start({ pushState: true });
           */
       // Determine if we need to change the base url, for a pushState link
       // opened by a non-pushState browser.
       this.fragment = fragment;
       var loc = this.location;
       // Transition from hashChange to pushState or vice versa if both are
       // requested.
       if (this._wantsHashChange && this._wantsPushState) {
         // If we've started off with a route from a `pushState`-enabled
         // browser, but we're currently in a browser that doesn't support it...
         if (!this._hasPushState && !this.atRoot()) {
           this.fragment = this.getFragment(null, true);
           this.location.replace(this.root + '#' + this.fragment);
           // Return immediately as browser will do redirect to new url
           return true;
         // Or if we've started out with a hash-based route, but we're currently
         // in a browser where it could be `pushState`-based instead...
         } else if (this._hasPushState && this.atRoot() && loc.hash) {
           this.fragment = this.getHash().replace(routeStripper, '');
           this.history.replaceState({}, document.title, this.root + this.fragment);
         }
       }
       if (!this.options.silent) return this.loadUrl();
     }
统一入口 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;
}
(六)backbone - API学习 - Backbone路由的更多相关文章
- (三)backbone - API学习 - v0.9.2 与 v1.1.2区别
		Backbone.View v0.9.2 中Backbone.View 可以导出对象的options属性, v1.1.2 中去掉该属性,通过如下代码 viewOptions = ['model', ' ... 
- python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作
		django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ... 
- 开始学习 Backbone
		[转]开始学习 Backbone 如何将模型-视图-控制器 (MVC) 架构引入 Ajax Web 应用程序 如何高效管理 Web 应用程序中的数目众多的 JavaScript 代码行是一个挑战.As ... 
- 【转】Backbone.js学习笔记(一)
		文章转自: http://segmentfault.com/a/1190000002386651 基本概念 前言 昨天开始学Backbone.js,写篇笔记记录一下吧,一直对MVC模式挺好奇的,也对j ... 
- backbone库学习-Router
		backbone库的结构http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文的例子来自http://blog.csdn.n ... 
- backbone库学习-model
		backbone库的结构: http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文所有例子来自于http://blog.cs ... 
- 【转】Backbone.js学习笔记(二)细说MVC
		文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ... 
- Backbone.js学习之一
		昨天一个我崇拜的朋友,徐飞送我一本名为<Backbone.js实战>书,让我心中狂喜,于是带着这份浓厚的兴趣,开始研究Backbone.js之路. 打开这本书的第一句话就很有哲理,“授人以 ... 
- (一)backbone - API入门
		初探 backbone采用MVC模式,本身提供了模型.控制器和视图从而我们应用程序的骨架便形成. Backbone.js 唯一重度依赖 Underscore.js. 对于 RESTful , hist ... 
随机推荐
- CSS选择器解析
			通配符选择器 Universal Selector * { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizin ... 
- Python中else语句块(和if、while、for、try搭配使用)
			学过C/C++的都知道,else语句是和if语句搭配使用的, 但是在Python中,else语句更像是作为一个模块,不仅仅可以和if语句搭配,还可以和循环语句,异常处理语句搭配使用.下面逐个进行介绍: ... 
- 文成小盆友python-num17 - django基础
			一.首先了解web应用的本质 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 下面利用socket实现一个简单的web框架: #!/usr/b ... 
- C程序设计语言练习题1-22
			练习1-22 编写一个程序,把较长的输入行”折“成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非空格之后.要保证程序能够智能地处理输入行很长以及在制定的列前没有空格或制表符时的情况. ... 
- 【GoLang】golang 微服务框架 go-kit
			golang-Microservice Go kit - A toolkit for microservices kubernetes go-kit_百度搜索 Peter Bourgon谈使用Go和& ... 
- c# 6.0 学习笔记
			refer : http://www.cnblogs.com/yinrq/p/5600530.html http://www.cnblogs.com/wolf-sun/p/5168217.html h ... 
- AD怎样画 board shape
			先用随便那一层的线,画出你想要的边框的形状,圆角可通过shift+空格来切换出来选中你刚刚话的形状(要是闭合面),design-board sharp-define from selected obj ... 
- 为何某些公司不允许使用C++ STL?
			说几个STL的缺点吧,虽然都是在比较极端的情况下出现,但是对于一些大项目还是会遇到的 1. 代码膨胀问题每一个实例化过的模板类,都会膨胀出一份独立的代码,比如std::vector<std::s ... 
- 手机低端市场,联发科 vs 高通
			联发科(MTK) 是山寨机的源头,我过去曾经鄙视他,现在来了180度转弯. 其实联发科是台湾的上市公司,手机如此复杂的东西,当年 联发科能把基础的手机做出来,而后小山寨厂改改外形,配件就能出若干款手机 ... 
- delphi7开发webservice部属在apache服务器中  转
			delphi7开发webservice部属在apache服务器中 delphi7 webservice apache 用Delphi7开发Web Service程序,并把服务程序放在apache We ... 
