Backbone事件模块及其用法
事件模块Backbone.Events在Backbone中占有十分重要的位置,其他模块Model,Collection,View所有事件模块都依赖它。通过继承Events的方法来实现事件的管理,可以说,它是Backbone的核心组成部分。
此外,事件模块的所有方法都挂在了全局的Backbone上,如果你的代码中需要用到自定义事件(实现观察者模式),可以直接使用它。
一、Events API
1.0之前只提供了三个基本方法 on/once/off/trigger,1.0开始增加了几个实用方法 listenTo/listenToOnce/stopListening。
以下是各个方法的意义
- on 添加自定义事件
- off 删除自定义事件
- trigger 派发自定义事件
- once 添加只执行一次的自定义事件 (内部依赖于_.once)
- listenTo 添加一个观察对象
- listenToOnce 添加一个仅执行一次的观察对象
- stopListening 删除添加的观察对象
二、基本事件方法
1.绑定 on方法
使用on方法可以给一个对象的自定义事件绑定触发该事件时执行的函数,当自定义的事件触发时,绑定的函数将会被执行。其调用格式如下:
obj.on(eventName, function, [context])
其中,参数Obj表示对象本身;eventName表示自定义事件的事件名;function表示当事件触发时被执行的函数;可选参数context表示上下文对象,用于对象级事件的监听,即当一个对象需要监听另一个对象的事件时,可以使用该参数。
使用on方法不仅可以绑定用户的自定义事件,可以直接监听对象自带的一些事件,下面通过一些简单示例来演示具体使用过程。
示例1:使用on方法监听默认事件
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : ""
}
});
var man = new Person();
man.on('change', function () {
console.log('对象的默认值发生了变化');
});
man.set('name', 'breezefeng');
在上述代码中,首先定义一个名称为Person的数据模型类。在定义时,通过defaults参数设置两个名为“name” 和 “sex” 的默认数据项。然后,实例化一个名为man的模型类对象,并使用on方法向该对象绑定触发change事件时执行的函数,即只要对象的属性值发生变化,将会触发change事件。
示例2:使用on方法监听属性事件
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女"
}
});
var man = new Person();
man.on('change', function () {
console.log('对象的默认值发生了变化');
});
man.on('change:sex', function (model, value) {
console.log('你修改了性别属性值,最新值是:' + value)
});
man.set('sex', '男');
在上述代码中,分别给man对象绑定了两个事件,一个是默认事件change,另一个是属性事件change:sex,即sex属性变化事件。在属性变化事件的回调函数中,通过回传的value参数获取最新修改后的属性值。
示例3:使用on方法获取属性修改前的值
在使用on方法绑定change和change属性事件时,还可以通过回调函数中的model对象获取属性修改前的所有值,如下所示:
model.previous('attrName') //用于获取对象中某个属性的原有值
model.previousAttributes() //返回一个对象,保存上一个状态的所有属性的原有值
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
man.on('change:score', function (model, value) {
var oldScore = model.previous('score');
if (value > oldScore) {
console.log('你比上次进步了' + (value - oldScore) + '分');
} else if (value < oldScore) {
console.log('你比上次落后了' + (oldScore - value) + '分');
} else {
console.log('你的成绩没有变化');
}
});
man.on('change:age', function (model, value) {
var objAttr = model.previousAttributes();
var oldAge = objAttr.age;
if (value > oldAge) {
console.log('你又长大了' + (value - oldAge) + '岁');
} else if (value < oldAge) {
console.log('你又年轻了' + (oldAge - value) + '岁');
} else {
console.log('你的年龄没有变化');
}
});
man.set({
age : '36',
score : 200
});
在上述代码中,通过使用on方法分别绑定对象man的change:score 和 change:age两个属性事件。
在第一个属性事件change:score 中,通过回调函数中model模型对象的previous方法,获取上一次保存的score属性值。
在第二个属性事件change:age 中,通过回调函数中model模型对象的previousAttributes方法,获取上一次保存结果的对象,并将对象保存至变量objAttr中,再通过访问对象变量objAttr的方式获取上一次保存的age属性值。
示例4:使用on方法绑定多个事件
在Backbone中,除了使用on方法绑定单个对象的事件,还可以使用该方法同时绑定多个对象的事件。绑定的格式有两种,第一种为各个事件使用空格隔开,格式如下:
obj.on("eventName1 eventName2", function)
其中,使用空格隔开的参数eventName1 和 eventName2 表示被绑定的多个事件名称,function表示所有被绑定事件都要执行的自定义函数。
第一种绑定方式代码:
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
man.on('change:score change:age', function (model, value) {
var oldAge = model.previous('age');
var newAge = model.get('age');
if (oldAge != newAge) {
console.log('age原值:' + oldAge + ', 新值:' + newAge);
} var oldScore = model.previous('score');
var newScore = model.get('score');
if (oldScore != newScore) {
console.log('score原值:' + oldScore + ', 新值:' + newScore);
}
}); man.set('age', 36);
man.set('score', 200);
在使用on方法绑定事件中,有两种格式可以绑定多个事件,除第一种使用空格之外,第二种方法为使用对象方式绑定多个事件,格式如下:
var objEvent = {
eventName1 : function1,
eventName2 : function2
...
};
obj.on(objEvent);
在上述代码中,首先定义一个哈希对象objEvent,并以key/value的方式向该对象批量添加各个事件名称和要执行的事件函数,然后通过使用on方法绑定哈希对象即可。
接下来将第一种使用空格方式绑定多个事件的代码修改成使用哈希对象绑定多个事件功能,修改代码如下:
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
var objEvent = {
'change:score' : score_change,
'change:age' : age_change
};
man.on(objEvent);
function score_change (model, value) {
var oldScore = model.previous('score');
var newScore = model.get('score');
if (oldScore != newScore) {
console.log('score原值:' + oldScore + ', 新值:' + newScore);
}
}
function age_change (model, value) {
var oldAge = model.previous('age');
var newAge = model.get('age');
if (oldAge != newAge) {
console.log('age原值:' + oldAge + ', 新值:' + newAge);
}
}
man.set({
age : 36,
score : 200
});
2.绑定一次 once方法
在Backbone中,除使用on方法可以绑定对象的事件之外,还可以使用once完成对象事件的绑定,只不过once方法绑定的事件只执行一次,之后即使触发也不执行,其调用格式如下:
obj.once(eventName, function, [context])
示例代码如下:
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
var intNum = 0;
man.once('change', function () {
intNum++;
console.log('事件触发的次数为 : ' + intNum); //1
});
man.set('age', 36);
man.set('age', 37);
最终intNum打印出1,说明绑定的事件函数只执行了一次。
3.触发事件 trigger方法
trigger也是Backbone事件API中的一个重要方法,它的功能是触发对象的某一个事件,其调用格式如下:
obj.trigger(eventName)
使用trigger方法可以手动触发对象的任何事件,不仅是系统自带的系统事件,还可以是自定义事件。示例代码如下:
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
man.on('change_age_sex', function () {
console.log('你手动触发了一个自定义事件');
});
man.on('change:age', function (model, value) {
if (value != undefined) {
console.log('你修改后的年龄为 : ' + value);
} else {
console.log('你手动触发了一个年龄修改事件');
}
});
man.trigger('change_age_sex');
man.trigger('change:age');
man.set('age', 36);
不难看出,trigger方法的功能就是手动执行对象绑定的事件,类似于自定义一个函数后,调用该事件名。因此,该方法就是执行事件,不论该事件是自定义的还是系统自带的。
4.移出事件 off方法
在Backbone中,与绑定事件的on方法相对的是移除事件的off方法,该方法的功能是移除对象中已绑定的某个、多个或全部的时间,其调用格式如下:
obj.off(eventName, function, [context])
示例1:使用off方法移出对象的某个或多个绑定事件
在Backbone中,如果要移除对象的某个绑定事件,可以调用对象的off方法,指定需要移除的事件名称;如果有多个事件名称,则用空格隔开。
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
var m = 0, n = 0;
var callback_a = function () {
m++;
console.log('你执行事件的次数为:' + m);
};
var callback_b = function () {
n++;
console.log('你执行事件的次数为:' + n)
};
man.on('event_a', callback_a);
man.on('event_b', callback_b);
man.off('event_a');
man.trigger('event_a event_b');
man.off('event_a event_b');
man.trigger('event_a event_b');
示例2:使用off方法移除绑定事件的某个函数
在Backbone中,不仅可以调用对象的off方法移除已绑定的一个或多个事件,还可以移除绑定事件执行的某个函数。
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
var m = 0, n = 0;
var callback_a = function () {
m++;
console.log('你执行事件的次数为:' + m);
};
var callback_b = function () {
n++;
console.log('你执行事件的次数为:' + n)
};
man.on('event_a', callback_a);
man.on('event_b', callback_b);
man.off('event_a', callback_a);
man.trigger('event_a event_b');
man.off('event_b', callback_b);
man.trigger('event_a event_b');
示例3:使用off方法移除对象的全部绑定事件
在Backbone中,对象的off方法除了可以移除某个或多个事件、事件执行函数外,还可以通过不带参数的方式移除全部已绑定的事件,其调用格式如下:
obj.off()
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
var m = 0, n = 0;
var callback_a = function () {
m++;
console.log('你执行事件的次数为:' + m);
};
var callback_b = function () {
n++;
console.log('你执行事件的次数为:' + n)
};
man.on('event_a', callback_a);
man.on('event_b', callback_b);
man.off();
man.trigger('event_a event_b');
三、新增事件方法
1.监听事件 listenTo方法
相对于对象的on方法而言,listenTo方法的监听效果更为突出,它是一个对象监听另一个对象的事件,如果被监听对象触发了被监听的事件,执行相应的回调函数或代码块。例如,view对象要监听model对象的change事件,如果model对象触发了change事件,则需要刷新当前view对象,即执行下列监听方法的代码:
view.listenTo(model, 'change', view.render)
上面监听方法也等价于如下代码:
model.on('change', view.render, view)
其中,第三个参数为上下文环境对象,此时它的值为view,即model对象在触发change事件时,关联view对象进行执行view.render动作。
通过上述对listenTo方法的简单介绍,我们知道它是一个对象级别的事件监听方法,即在执行该方法时,必须要有两个对象,其调用格式如下:
obj1.listenTo(obj2, eventName, function
其中,参数obj1,obj2都为对象,参数eventName是obj2对象触发的事件名称,参数function为当obj2触发指定的eventName事件时,obj1所执行的自定义函数。
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
var obj = _.extend({}, Backbone.Events);
obj.listenTo(man, 'change:age', function (model, value) {
var oldAge = model.previous('age');
var newAge = model.get('age');
if (oldAge != newAge) {
console.log('age原值:' + oldAge + ', 新值:' + newAge);
}
});
man.set('age', 36);
2.监听一次 listenToOnce方法
在BackBone中listenTo方法 和 listenToOnce方法调用方式完全一致,唯一区别是前者是一个对象一直监听另一个对象事件的触发,而后者是仅监听一次。
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
var obj = _.extend({}, Backbone.Events);
var intNum = 0;
obj.listenToOnce(man, 'change:age', function (model, value) {
intNum++;
console.log('事件触发的次数为:' + intNum);
});
man.set('age', 36);
man.set('age', 37);
3.停止监听 stopListening方法
在Backbone中,与单个对象的off方法相同,对象级别的事件监听也有停止方法,即stopListening方法,其调用格式如下:
obj1.stopListening(obj2, eventName, function)
var Person = Backbone.Model.extend({
defaults : {
name : "",
sex : "女",
age : 32,
score : 120
}
});
var man = new Person();
var obj = _.extend({}, Backbone.Events);
obj.listenTo(man, 'change:name', function (model, value) {
console.log('姓名修改后的值为:' + value);
});
obj.listenTo(man, 'change:age', function (model, value) {
console.log('年龄修改后的值为:' + value);
});
obj.listenTo(man, 'change:score', function (model, value) {
console.log('分数修改后的值为:' + value);
});
//停止监听某一个事件
obj.stopListening(man, 'change:name');
man.set('name', '张三');
man.set('age', 35);
man.set('score', 600);
//停止监听两个事件
obj.stopListening(man, 'change:name change:age');
man.set('name', '李四');
man.set('age', 36);
man.set('score', 601);
//停止监听全部事件
obj.stopListening();
man.set('name', '王五');
man.set('age', 37);
man.set('score', 602);
以上就是Backbone.Events模块所有API的使用,欢迎留言讨论~
Backbone事件模块及其用法的更多相关文章
- Backbone事件模块源码分析
事件模块Backbone.Events在Backbone中占有十分重要的位置,其他模块Model,Collection,View所有事件模块都依赖它.通过继承Events的方法来实现事件的管理,可以说 ...
- Backbone源码解读(一)事件模块
Backbone源码浅读: 前言: Backbone是早起的js前端MV*框架之一,是一个依赖于underscore和jquery的轻量级框架,虽然underscore中基于字符串拼接的模板引擎相比如 ...
- 自己实现一个javascript事件模块
nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...
- jQuery源代码学习之九—jQuery事件模块
jQuery事件系统并没有将事件坚挺函数直接绑定在DOM元素上,而是基于事件缓存模块来管理监听函数的. 二.jQuery事件模块的代码结构 //定义了一些正则 // // //jQuery事件对象 j ...
- nodejs -- event 模块, 事件模块.
1. 注册事件 on 或者 addListener,触发事件 emit 1-1简单的使用: var EventEmitter = require('events').EventEmitter; var ...
- Javascript自定义事件功能与用法实例分析
原文地址:https://www.jb51.net/article/127776.htm 本文实例讲述了javascript自定义事件功能与用法.分享给大家供大家参考,具体如下: 概述 自定义事件很难 ...
- nodejs事件模块
nodejs 事件模块 events 只有一个对象 EventEmitter . var EventEmitter = require('events').EventEmitter;var life ...
- nginx事件模块分析(一)
nginx ngx_events_module模块分析 ngx_events_module模块是核心模块之一,它是其它所有事件模块的代理模块.nginx在启动时只与events模块打交道,而由even ...
- 关于js封装框架类库之事件模块
在触发DOM上的某个事件时,会产生一个事件对象event.这个对象中包含着所有与事件有关的信息.包括导致事件的元素,事件的类型以及其他与特定事件相关的信息. 例如: 鼠标操作点击事件时,事件对象中会获 ...
随机推荐
- SQL Server读写分离实现方案简介
读写分离是中型规模应用的数据库系统常见设计方案,通过将数据从主服务器同步到其他从服务器,提供非实时的查询功能,扩展性能并提高并发性. 数据库的读写分离的好处如下: 通过将“读”操作和“写”操作分离到不 ...
- Windows 7 在资源管理器中显示软件快捷方式
该方法是利用资源管理器中储存网络位置的文件夹实现的, 不需要修改注册表. 效果如图: 操作方法: 在资源管理器中打开路径 "%appdata%\Microsoft\Windows\Netwo ...
- ssl客户端与服务端通信的demo
服务端程序流程 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <str ...
- 项目实现不同环境不同配置文件-maven profile
最近接触的项目都是在很多地方都落地的项目,需要支持不同的环境使用不同的配置文件.一直以来都以为是人工的去写不同的配置文件,手动的去修改运用的配置文件.感觉自己还是太low呀.maven的使用的还停留在 ...
- MPLS与LDP从入门到了解
多协议标签交换(MPLS)是一种用于快速转发数据包的技术,它的出现就是为了提高转发效率.因为IP转发大多靠软件进行,在转发的每一跳都要进行至少一次最长匹配查找,操作复杂导致转发速度比较慢.有些厂商借鉴 ...
- 绘制扇形效果线条小Bug解决
绘制线条基本代码: 变量: CPoint m_ptOrigin;//起点坐标 bool m_bTrue;//检查鼠标左键是否按下 CPoint m_ptOldOrigin;//记录上一次绘制终点坐标, ...
- [bzoj1007][HNOI2008][水平可见直线] (斜率不等式)
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y ...
- [LeetCode] Different Ways to Add Parentheses 添加括号的不同方式
Given a string of numbers and operators, return all possible results from computing all the differen ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- C /C++ 语言练习册
/************************************** 整数对应 32 bit 二进制数串中数字1的个数 2016-10-24 liukun ***************** ...