Backbone事件模块

事件模块Backbone.Events是Backbone的核心,Model、Collection、View都依赖它。

此外,事件模块的所有方法都挂在了全局的Backbone上,如果你的代码中需要用到自定义事件(实现观察者模式),可以直接使用它。

 示符Events是内部的一个引用,为讨论方便,这里也省去了前缀Backbone。

一、Events API

1.0之前只提供了三个基本方法 on/once/off/trigger,1.0开始增加了几个实用方法 listenTo/listenToOnce/stopListening。

以下是各个方法的意义

  • on 添加自定义事件
  • off 删除自定义事件
  • trigger 派发自定义事件
  • once 添加只执行一次的自定义事件 (内部依赖于_.once)
  • listenTo 添加一个观察对象
  • listenToOnce 添加一个仅执行一次的观察对象
  • stopListening 删除添加的观察对象

二、Events的代码初窥

var Events = Backbone.Events = {
    on: function(name, callback, context) {
        // ...
    },
    once: function(name, callback, context) {
        // ...
    },
    off: function(name, callback, context) {
        // ...
    },
    trigger: function(name) {
        // ...
    },
    stopListening: function(obj, name, callback) {
        // ...
    }
};
 
var eventSplitter = /\s+/;
var eventsApi = function(obj, action, name, rest) {
    // ...
};
var triggerEvents = function(events, args) {
    // ...
};
var listenMethods = {listenTo: 'on', listenToOnce: 'once'};
 
_.each(listenMethods, function(implementation, method) {
    Events[method] = function(obj, name, callback) {
        // ...
    };
});
 
Events.bind   = Events.on;
Events.unbind = Events.off;
 
_.extend(Backbone, Events);

1. 先定义了一个对象(单例),直接挂上了接口方法on/once/off/trigger/stopListening,注意虽然Events头字母大写,这里不是定义一个类或构造器,而是一个单例对象。

    剩下的变量和函数都是辅助这个对象的,它们都在闭包空间里,外部不可访问如eventSplitter、eventsApi等

2. eventSplitter用来实现空格间隔一次添加多个事件,如 .on('event1 event2', handler)

3. eventsApi实现的很巧妙,它辅助on/once、off、trigger完成事件的添加、删除、派发。

4. triggerEvent辅助trigger方法实现派发事件,它的实现有些特殊,见 冗余换性能

5. 后面的listenMethod和一个each迭代,会给Events添加两个新方法listenTo和listenToOnce

6. 再下面两行给on/off分别取了别名bind/unbind。其实这也是为了兼容老版本,最早的版本添加/删除事件为bind/unbind。

7. 最后一行把Events掺合到全局的Backbone对象上了

拓扑图如下

三、Events内部数据结构 (_events/_listeners)

相对来说,目前的内部数据结构比较简单。采用传统的先哈希,后数组存储事件处理器对象,处理器对象上有callback和context及ctx。其内部有两个关键对象_eventshe _listeners,都以下划线开头,说明这是私有的(并非真正私有,一种语法约定,真正私有可使用闭包实现),仅供内部使用。

_events 这个哈希是默认是挂在Backbone.Events上,由于Events是一个对象,所以很容易被Mix到任何想增加自定义事件的类或对象上。此时_events则挂在该对象上。如Backbone.Model,Backbone.Collection,Backbone.View,当给其实例添加自定义事件时,_events则挂在它们的实例对象上。 

_events的结构如下

_.extend(Backbone, Events);

_listeners 和 _events一样默认也是挂在Backbone.Events上。顾名思义,它是一个监听器,即可以为其它对象(具有Backbone.Events的所有方法的对象)被添加事件。它的key是以字母“l”开头后跟递增的数字组成,value是一个 “a mixin of Backbone.Events”。

_listeners的结构如下

最后又把Events上的所有方法都拷贝到标示符Backbone这个全局对象上,即给Backbone添加了如下方法。这时可以很方便的使用它给自己的类添加自定义事件。

四、 特殊事件“all”

事件名“all”,在trigger方法中,仔细看代码,你会发现trigger方法中调用了两次triggerEvents,一次是通过参数传进来的事件,另一次则固定为“all”事件。

var events =this._events[name];
var allEvents =this._events.all;
if (events) triggerEvents(events, args);
if (allEvents) triggerEvents(allEvents, arguments);

trigger的通常实现只需把事件名,参数传进来,取哈希(这里是_events)上取该事件的所有handlers(存在在数组里),挨个执行。但这里为什么每一次trigger调用还要单独取下all事件,然后执行呢?

如果只看Backbone.Events模块,是很难理解的。那么就搜索下整个Backbone.js,看“all”事件在哪些地方使用到。最后发现只在Backbone.Collection中用到,且仅一处。

model.on('all',this._onMod事件elEvent,this);

只看这一行代码,还是难以理解。需要结合Backbone.Model和Backbone.Collection一起看。

这里先简单说下,我们知道这行代码所在方法是Collection.add,在往collection中添加model时执行的,即添加的model都会注册一个“all”事件。而当model自身销毁(destroy)或修改(change)的时候,需要通知其所在Collection。

例如,model销毁后,Collection需要在集合中把它删除,Collection的长度也需要减一。model修改后,也需要通知Collection,这样给Collection添加的change事件也会触发。

这就是“all”事件的真正用途,以前曾想既然Backbone的View和通信都依赖于jQuery,那么事件模块也完全可以使用$.Callbacks。不曾想到还有一个特殊的“all”事件。

五、Events与Model、Collection、View、Router、History的关系

来看下代码

_.extend(Model.prototype, Events, {
 
})
_.extend(Collection.prototype, Events, {
 
})
_.extend(View.prototype, Events, {
 
})
_.extend(Router.prototype, Events, {
 
})

把事件模块mixin到这几个类的原型上去了。一句话,这些类都具有Pub/Sub的功能,即都可以实现自定义事件,它们之间也就可以通过事件很方便的降低耦合。如果在加上数据、视图、逻辑的分层效果,这就是整个Backbone的精华了。

资料来源:http://www.cnblogs.com/snandy/






转载于:https://my.oschina.net/u/1162598/blog/161798

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
---------------- backbone开发经典 336页清晰完整版pdf-------------- 内容简介 · · · · · · backbone.js提供了一套web开发的框架,为复杂javascript应用程序提供一个mvc结构。 《backbone.js应用程序开发》详细介绍了如何使用backbone.js完成web应用开发。全书从了解mvc、spa和backbone.js的基本知识开始,然后着手构建3个示例应用程序;此外,backbone和grunt-bbb、jquery mobile等开发工具的配合使用,以及jasmine、qunit和sinonjs等测试解决方案。 本书的作者是知名的javascript专家、谷歌chrome团队的工程师addy osmani。本书适合于javascript程序员、web开发人员,尤其是想要学习和使用backbone.js的读者阅读参考。 如果你想使用单页应用程序(spa)模型创建前端站点,本书向你展示了如何使用backbone.js完成这类工作。你将学会使用backbone自有风格的模型-视图-控制器(mvc)架构,来创建结构化的javascript应用程序。 《backbone.js应用程序开发》先从了解mvc、spa和backbone的基本知识开始,然后着手构建示例应用程序——一个简单的todo列表应用程序、restful风格的图书应用程序、以及使用backbone和requirejs的模块化应用程序。本书的作者是谷歌chrome团队的工程师addy osmani,他还演示了框架的高级应用。 《backbone.js应用程序开发》包括以下内容: 了解backbone.js如何给客户端带来mvc方面的好处; 编写易于阅读的、结构化的和易扩展代码 ; 使用backbone.marionette和thorax扩展框架; 解决使用backbone.js时会遇到的常见问题; 使用amd和requirejs将代码进行模块化组织; 使用backbone.paginator插件为collections数据分页; 使用样板代码引导新的backbone.js应用程序; 使用jquery mobile,并解决两者之间的路由问题; 使用jasmine、qunit和sinonjs对backbone应用进行单元测试。 作者简介 · · · · · · Addy Osmani,本书的作者是知名的JavaScript专家、谷歌Chrome团队的工程师,他对JavaScript应用程序架构有着强烈的爱好,还创建了一些比较流行的项目,如TodoMVC,并且对Yeoman、Modernizr和jQuery等其他开源项目也有重要贡献。除此之外,Addy Osmani也是一位高产的博主(http://addyosmani.com/blog),同时也是O'reilly出版的《JavaScript设计模式》一书的作者。 徐涛(网名:汤姆大叔;微博:@TomXuTao),微软最有价值专家(MVP)、项目经理、软件架构师,擅长大型互联网产品的架构与设计,崇尚敏捷开发模式,熟悉设计模式、前端技术、以及各种开源产品,曾获MCP、MCSE、MCDBA、MCTS、MCITP、MCPD、PMP认证。《JavaScript编程精解》、《JavaScript启示录》译者,博客地址:Http://www.cnblogs.com/TomXu。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值