前言:

backbone由以下模块组成。

一。Event

监听事件,自定义事件。绑定到任何对象。

http://www.css88.com/doc/backbone/#Events

这个是下面模块核心。几乎所有都会有用到。

all事件,所有各自对象监听的事件,都会同时触发此事件。

如下代码:

  1. trigger: function(name) {
  2. if (!this._events) return this;
  3. var args = slice.call(arguments, 1);
  4. if (!eventsApi(this, 'trigger', name, args)) return this;
  5. var events = this._events[name];
  6. var allEvents = this._events.all; //即触发所有事件都会 去尝试看下触发 all事件。
  7. if (events) triggerEvents(events, args);
  8. if (allEvents) triggerEvents(allEvents, arguments);
  9. return this;
  10. }

二,view

构造函数:1.确定好页面父元素el,2.取消和绑定事件,3.整理好配置参数。4.初始化函数。

1.通过监听模型变化(change),渲染dom节点。

2.监听模型数据变化(change),获取数据。

3.绑定事件。

4.el:$('body')

方法: $: 在el下 查找元素。

三,model

所有显示模型数据的 Views 会接收到该事件的通知,继而视图重新渲染。 你无需查找DOM来搜索指定id的元素去手动更新HTML。

model初始化也可以有个collection集合。

属性:

default:默认的数据。若基础数据没有值,或者undefined就会填充。

方法:

set: 手动触发

change:模型属性的变化会触发change事件。

save:保存数据到服务器,如下,可以设置成功和失败回调。

  1. todo.save({'done': done},{success:function(){alert('chenggong')}})

destroy:方法,同save,删除数据到服务器。可以设置成功和失败回调。

this.model.destroy();

fetch:读取服务器数据

四,collection

1.构造函数:

  1. var Collection = Backbone.Collection = function(models, options) {
  2. options || (options = {});
  3. if (options.model) this.model = options.model;
  4. if (options.comparator !== void 0) this.comparator = options.comparator;
  5. this._reset();
  6. this.initialize.apply(this, arguments);
  7. if (models) this.reset(models, _.extend({ silent: true }, options)); //也可以直接实例化模型数组。(在ajax成功可以有一次)
  8. }

fetch方法:获取服务器数据,设置成功,失败的回调操作。

  1. fetch: function(options) {
  2. options = options ? _.clone(options) : {};
  3. if (options.parse === void 0) options.parse = true;
  4. var success = options.success;
  5. var collection = this;
  6. options.success = function(resp) {
  7. var method = options.reset ? 'reset' : 'set';
  8. collection[method](resp, options); //成功会触发set,默认,reset也是set只是会触发 reset事件,并且清除以前的模型数据。
  9. if (success) success(collection, resp, options);
  10. collection.trigger('sync', collection, resp, options);
  11. };
  12. wrapError(this, options);
  13. return this.sync('read', this, options);
  14. },

1.set方法:判断新增的模型并且实例化数据模型(监听模型的all事件),则会触发模型的add事件,和对应的集合的add,remove,sort 事件。

模型的all事件:所有模型的事件都会触发这个all事件,然后all事件是关联着集合的对应的事件,即监听模型的事件既是集合对应的事件也会发生。所以一般监听collection集合的 add,all,remove事件都可以。如下代码:

  1. //_addReference,即以模型的增,删,改动,去触发对应的集合的add,sort,remove事件。
    // Internal method to create a model's ties to a collection.
  2. _addReference: function(model, options) {
  3. this._byId[model.cid] = model;
  4. var id = this.modelId(model.attributes);
  5. if (id != null) this._byId[id] = model;
  6. model.on('all', this._onModelEvent, this);
  7. }

2.reset方法: 清除集合的模型,无声的增加新的模型数组,并触发reset事件。(当拿到数组行数据的时候用到,需要将数据转换为模型实例),

all事件都是

3.add事件: 当模型变化的时候会触发,函数会接收到参数这个模型,这个集合,还有集合的参数。(model, this, addOpts)。

五,router

 匹配规则:

1) /:query ,这个冒号是除了?/以外的匹配。

例子:

  1. 'abc/:loanId': function(loanId) { //匹配abc/123,abc/32,构建的正则是, /^abc\/([^\/?]+)(?:\?([\s\S]*))?$/
  2. console.log(loanId)
  3.  
  4. }
  1. //route:是构建的正则,fragment是hash片段。
    //返回 :匹配的参数(123,上个例子),和?问号后面的片段,以数组形势返回。
    _extractParameters: function(route, fragment) {
  2. var params = route.exec(fragment).slice(1);
  3. return _.map(params, function(param, i) {
  4. // Don't decode the search params.
  5. if (i === params.length - 1) return param || null;
  6. return param ? decodeURIComponent(param) : null;
  7. });
  8. }

2) *: 这个星号除了 ? 以外的匹配。

路由的匹配规则 正则表达式的代码片段。

// var optionalParam = /\((.*?)\)/g;
// var namedParam = /(\(\?)?:\w+/g;
// var splatParam = /\*\w+/g;
// var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g;

  1. _routeToRegExp: function(route) {
  2. route = route.replace(escapeRegExp, '\\$&') // 将 - { } [ ] + ? . , \ ^ $ # 空格 等进行转义
  3. .replace(optionalParam, '(?:$1)?') // 规则中的括号部分 也就是可有可没有的部分
  4. .replace(namedParam, function(match, optional) {
  5. return optional ? match : '([^/?]+)'; // 将不带括号部分的 但是:...形式的进行替换可以匹配为非/以外任意字符
  6. })
  7. .replace(splatParam, '([^?]*?)'); // 将*...形式的替换为除换行以外的任何字符匹
  8. return new RegExp('^' + route + '(?:\\?([\\s\\S]*))?$'); //构建正则
  9. },

路由触发时触发的对应的函数。如下:

  1. /*
    *@route, this.routes的key值,
    *@ name,this.routes的value值,即对应的函数名。
    route: function(route, name, callback) {
  2.  
  3. if (!_.isRegExp(route)) route = this._routeToRegExp(route);
  4. if (_.isFunction(name)) {
  5. callback = name;
  6. name = '';
  7. }
  8. if (!callback) callback = this[name];
  9. var router = this;
  10. Backbone.history.route(route, function(fragment) {
  11. var args = router._extractParameters(route, fragment);
  12. if (router.execute(callback, args, name) !== false) {
  13. router.trigger.apply(router, ['route:' + name].concat(args));
  14. router.trigger('route', name, args);
  15. Backbone.history.trigger('route', router, name, args);
  16. }
  17. });
  18. return this;
  19. },

2.初始化:

1)new router,写好路由规则, 将匹配函数入口注册,

2)Backbone.history.start();  // ,注册 pushstate, hashchange 等事件。触发就将匹配的 函数触发。

  1. define(['backbone'], function () {
  2.  
  3. var Router = Backbone.Router.extend({
  4.  
  5. routes: {
  6. 'module1': 'module1',
  7. 'module2(/:name)': 'module2',
  8. '*actions': 'defaultAction'
  9. },
  10.  
  11. //路由初始化可以做一些事
  12. initialize: function () {
  13. },
  14.  
  15. module1: function() {
  16. var url = 'module1/controller1.js';
  17. //这里不能用模块依赖的写法,而改为url的写法,是为了grunt requirejs打包的时候断开依赖链,分开多个文件
  18. require([url], function (controller) {
  19. controller();
  20. });
  21. },
  22.  
  23. //name跟路由配置里边的:name一致
  24. module2: function(name) {
  25. var url = 'module2/controller2.js';
  26. require([url], function (controller) {
  27. controller(name);
  28. });
  29. },
  30.  
  31. defaultAction: function () {
  32. console.log('404');
  33. location.hash = 'module2';
  34. }
  35.  
  36. });
  37.  
  38. var router = new Router();
  39. router.on('route', function (route, params) {
  40. console.log('hash change', arguments); //这里route是路由对应的方法名
  41. });
  42.  
  43. return router; //这里必须的,让路由表执行
  44. });

navigate方法:会将url,#后面的替换掉。

六,history

注册事件。

navigator方法:到页面。

backbonejs的更多相关文章

  1. 使用requireJS,backboneJS,和underscoreJS完成自定义模板封装

    使用requireJS,backboneJS,和underscoreJS完成自定义模板封装 原来的代码 当我们进行一个列表的数据填充的时候,是这样做的: //获取美食列表 function getFo ...

  2. backbonejs mvc框架的增删查改实例

    一:开发环境 coffeescript和nodejs需要先安装,没装网上自己查安装步骤. 代码编写环境及esp框架下载: esp框架下载地址:https://github.com/nonocast/e ...

  3. 《BackboneJS框架的技巧及模式》(4)完结篇

    <BackboneJS框架的技巧及模式>(4)完结篇 本文紧接第二部分:<BackboneJS框架的技巧及模式(3)> 作者:chszs,转载需注明.博客主页:http://b ...

  4. 《BackboneJS框架的技巧及模式》(2)

    <BackboneJS框架的技巧及模式>(2) 本文紧接第一部分:<BackboneJS框架的技巧及模式(1)> 作者:chszs,转载需注明.博客主页:http://blog ...

  5. backbonejs mvc框架

    backbonejs mvc框架的增删查改实例 一:开发环境 coffeescript和nodejs需要先安装,没装网上自己查安装步骤. 代码编写环境及esp框架下载: esp框架下载地址:https ...

  6. BackboneJS 源码注释

    Backbone 作者在源码中做了很好的注释,这里只是锦上添花,补充一些个人的理解而已. // Backbone.js 1.2.3 // (c) 2010-2015 Jeremy Ashkenas, ...

  7. 三大JavaScript框架对比——AngularJS、BackboneJS和EmberJS

    <三大JavaScript框架对比——AngularJS.BackboneJS和EmberJS> 本文转载自  作者:chszs,博客主页:http://blog.csdn.net/chs ...

  8. backbonejs使用

    backbone是一个非常好的前端MVC框架,将数据与逻辑分离出来,在稍大一点项目中,backbone都有用武之地. 个人感觉backbone最好的地方就是通过事件来管理数据改变导致的视图改变,bac ...

  9. backbonejs中的集合篇(一)

    一:集合概念 集合是多个模型,如果把模型model理解为表结构中的行,那么集合collection就是一张表,由多个行组成.我们经常需要用集合来组织和管理多个模型. 二:创建集合 1:扩展Backbo ...

随机推荐

  1. redis cluster php 客户端 predis

    php有redis的扩展,目前来说,还不支持redis cluster,推荐一下predis,功能比较全,从单个,到主从,到cluster都是支持的.效率怎么样,要靠自己去测试一下. 1,下载pred ...

  2. jython安装与配置

    安装jython 0. 计算机中要安装jdk 1. 在官网www.jython.org上找到下载页面,然后下载jython-installe 2. 在cmd.exe中运行java -jar jytho ...

  3. Spring PropertyPlaceholderConfigurer数据库配置

    pom.xml中添加依赖 <!-- mysql-connector-java --> <dependency> <groupId>mysql</groupId ...

  4. 5.openstack之mitaka搭建计算节点

    部署计算节点(compute服务) 一:控制节点配置 1.建库建用户 CREATE DATABASE nova_api; CREATE DATABASE nova; GRANT ALL PRIVILE ...

  5. 进程互斥和fork

    自父进程继承 进程的资格(真实(real)/有效(effective)/已保存(saved) 用户号(UIDs)和组号(GIDs)) 环境(environment) 堆栈 内存 打开文件的描述符(注意 ...

  6. ASM:《X86汇编语言-从实模式到保护模式》第15章:任务切换

    15章其实应该是和14章相辅相成的(感觉应该是作者觉得14章内容太多了然后切出来了一点).任务切换和14章的某些概念是分不开的. ★PART1:任务门与任务切换的方法 1. 任务管理程序 14章的时候 ...

  7. (转)Java中使用Jedis操作Redis

    转自http://www.cnblogs.com/liuling/p/2014-4-19-04.html 使用Java操作Redis需要jedis-2.1.0.jar,下载地址:http://file ...

  8. VS2010+C#+EmguCV 配置详解

    在VS2010(VC10)中配置能使用C#开发语言调用Open CV视觉库的方法如下.众所周知,能供C#使用的OpenCV库叫:Emgu CV.注意用C#开发的话,是不需要单独安装OpenCV的,em ...

  9. ORA-20011 ORA-29913 and ORA-29400 with Associated KUP-XXXXX Errors from DBMS_STATS.GATHER_STATS_JOB(Doc ID 1274653.1)

    首先在alert log裡面頻繁的看見如下錯誤: DBMS_STATS: GATHER_STATS_JOB encountered errors.  Check the trace file. Err ...

  10. 目标跟踪_MeanShift

    找到一些关于目标跟踪的资料 http://blog.csdn.net/jinshengtao/article/details/30258833 http://blog.sina.com.cn/s/bl ...