事件绑定  on()方法

调用格式:object.on(event, callback, [context])
"change" — 当attributes变化时
"change:[attribute]" — 当attributes的一个特定属性变化时
(当同时监听了这2个事件时,触发顺序是先"change:[attribute]"事件,再"change" 事件。)

var User=Backbone.Model.extend({
defaults:{
name:'susan',
age:18},
initialize:function(){
this.on('change',function(){
console.log(1);
})
}
});
var user=new User();
user.set('name','jack');
//
user.set('name','lily');
//
var User=Backbone.Model.extend({
defaults:{
name:'susan',
age:18},
initialize:function(){
this.on('change:name',function(model){
console.log(model.cid);
})
}
});
var user=new User();
user.set('name','lucy');
//c1
var User=Backbone.Model.extend({
defaults:{
name:'susan',
age:18},
initialize:function(){
this.on('change:name',this.show);
},
show:function(){
console.log('show');
}
});
var user=new User();
user.set('name','lucy');
//show

注:在使用on绑定change和change:attr事件时,可以通过其回调函数的参数model获取属性修改之前的值:
model.previous("attrName");//获取单个属性
model.previousAttributes();//获取所有属性

绑定多个事件的两种方式

一、事件之间用空格分隔,如

model.on("eventName1 eventName2",function(){});//1

model.on("eventName:attr1 eventName:attr2",function(){});//2
在测试时,遇到一个觉得困扰的问题:

    var User=Backbone.Model.extend({
name:'susan',
age:18
}); var user=new User(); user.on('change:name change:age',function(model,value){
console.log("changed");
}); user.set({
name:'lily',
age:19
});

我以为只调用了一次set,控制台就只会输出一次“changed”,但事实上它输出了两次:

    var User=Backbone.Model.extend({
name:'susan',
age:18
}); var user=new User(); user.on('change:name change:age',function(model,value){
console.log("changed")
if(model.get('name')!==model.previous('name')||model.get('age')!==model.previous('age')){
console.log(model.get('name'),model.get('age'),value);
} }); user.set({
name:'lily',
age:19
}); //lily 19 lily
//lily 19 19

查看backbone的set方法发现:

for in 遍历把每一项属性名push到changeS数组中,比如在这个例子中,for in之后changes为['name','age']
接着for循环数组changes,触发change:事件,这就是为什么 user.set({name:'lily',age:19})控制台会输出两次的原因。

第二种:先定义一个对象,在对象中以键值对的方式添加事件名称和相应的函数:
var eventObj={
   eventName1:function1,
   eventName2:function2

}

    var User=Backbone.Model.extend({
name:'susan',
age:18
});
var user=new User(); var name_change=function(model,value){ };
    var age_change=function(model,value){

    };
var ev={
"change:name":name_change,
"change:age":age_change
}
user.on(ev); user.set({
name:'lily',
age:19
});

关于这两种方法,第一种需要考虑事件执行顺序和重复执行的可能性,更适合多个执行同一个函数的情景,而第二种适合事件和函数一一对应的情景。

once方法 只执行一次的绑定

调用格式:object.once(event, callback, [context])

    var User=Backbone.Model.extend({
name:'susan',
age:18
});
var user=new User();
var num=0;
user.once("change",function(){
num++;
console.log("changed+"+num);
}) user.set({name:'lily',age:19});
user.set({name:'lily',age:19}); //changed+1

trigger方法 手动触发

调用格式:object.trigger(event, [*args])

    var User=Backbone.Model.extend({
name:'susan',
age:
});
var user=new User();
var num=;
user.once("change",function(){
console.log("changed");
}) user.trigger("change");

off方法 移除事件

调用格式:object.off([event], [callback], [context])

用于移除对象上绑定的一个、多个或者全部事件。移除多个事件时,事件之间用空格分隔,trigger方法也可以用这种方式手动触发多个事件

    var User=Backbone.Model.extend({
name:'susan',
age:18
});
var user=new User();
var num=0;
user.on("change_name change_age",function(){
console.log("changed+"+(++num));
}) user.trigger("change_name change_age");
user.off("change_name change_age");
user.trigger("change_name change_age");

移除绑定事件执行的回调:

    var User=Backbone.Model.extend({
name:'susan',
age:18
});
var user=new User();
var num=0;
var fn=function(){
console.log("changed+"+(++num));
}; user.on("change_name change_age",fn); user.trigger("change_name change_age");
user.off(null,fn);
user.trigger("change_name change_age"); //changed+1
//changed+2
var User=Backbone.Model.extend({
name:'susan',
age:18
});
var user=new User();
var num1=0,num2=0;
var fn1=function(){
console.log("changed+"+(++num1));
};
var fn2=function(){
console.log("changed2+"+(++num2));
};
user.on("change_name change_age",fn1);
user.on("change_name change_age",fn2); user.trigger("change_name change_age");
user.off(null,fn1);
user.trigger("change_name change_age"); // changed+1
// changed2+1
// changed+2
// changed2+2
// changed2+3
// changed2+4

如果要移除所有的事件,不带参数,obj.off()即可。

listenTo方法

view.listenTo(model, 'change', view.render);

第一个参数是模块,第二个参数是事件类型,第三个参数是事件回调。
on与listenTo的区别是:on方法是监听对象中某一个事件的触发,如果触发了事件,就执行回调。而listenTo是一个对象A监听另一个对象B的事件,如果B的事件被触发了,则A要执行自己的回调。

view.listenTo(model,'change',view.render) 等价于  model.on('change',view.render,view)

var User=Backbone.Model.extend({
defaults:{name:"susan",age:"18"},
change_name:function(){
console.log("name has changed");
}
});
var user=new User();
var obj=_.extend({},Backbone.Events);
obj.listenTo(user,"change:name",user.change_name);
user.set("name","loly");

事件与视图

var User=Backbone.Model.extend({
defaults:{
name:'susan',
age:18}
});
var UserView=Backbone.View.extend({
tagName:'span',
initialize:function(){
this.listenTo(this.model,'change:name',this.show);
},
show:function(){
this.$el.text('show').appendTo('body');
}
});
var user=new User();
var userview=new UserView({model:user,});
user.set('name','lucy');

运行结果是body添加了一个span标签:<span>show</span>

Backbone学习记录(4)的更多相关文章

  1. Backbone学习记录(7)

    事件委托 <form> <input type="text" class="txt"> <input type="but ...

  2. Backbone学习记录(6)

    路由 backbone将路由规则和一个方法名绑定到一起,来控制单页的hash,以及单页的前进后退. var UserRouter = Backbone.Router.extend({ routes: ...

  3. Backbone学习记录(5)

    数据与服务器 var User=Backbone.Model.extend({ defaults:{ name:'susan', age:18 }, url:'/user'//数据提交的路径 }); ...

  4. Backbone学习记录(3)

    创建视图 同前面创建模型和集合的方式一样,Backbone.View.extend()即可创建视图 var UserView=Backbone.View.extend(); var view1=new ...

  5. Backbone学习记录(2)

    创建一个集合 1)new Backbone.Collection()方式 var user=new Backbone.Model({'name':'susan'}); var list=new Bac ...

  6. Backbone学习记录(1)

    去年买的<基于MVC的javascript Web富应用开发>,拖到现在还没看完,作者介绍了三个MVC框架,Spine ,backbone和javascriptMVC.1和2在国内的流行度 ...

  7. Backbone 学习笔记

    Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用. 借助Backbone 我们可以使用REST的方式来最小化客户 ...

  8. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  9. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

随机推荐

  1. Shell编程——Shell中的数学运算

    在Linux Shell中进行数学运算,通常能够使用的运算符有: 简单运算: let [] (()) 高级运算: expr bc 1.let命令 let命令是bash内置命令.能够实现简单的算术以及逻 ...

  2. VC FTP服务器程序分析(四)

    下面是数据传输的重点-CDataSocket类,函数不多,都比较重要. 1.OnAccept  数据tcp服务器被连接的虚函数,由框架调用. void CDataSocket::OnAccept(in ...

  3. bzoj5483: [Usaco2018 Dec]Balance Beam

    又又又又又又又被踩爆了 首先容易写出这样的期望方程:f(1)=max(d(1),f(2)/2),f(n)=max(d(n),f(n-1)/2), f(i)=max(d(i),(f(i-1)+f(i+1 ...

  4. Opencv与dlib联合进行人脸关键点检测与识别

    前言 依赖库:opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不记录如何配置,重点在实现上.使用libfacedetection实现人脸区域检测,联合dlib标记 ...

  5. 利用PyCharm的Profile工具进行Python性能分析

    Profile:PyCharm提供了性能分析工具Run->Profile,如下图所示.利用Profile工具可以对代码进行性能分析,找出瓶颈所在. 测试:下面以一段测试代码来说明如何使用pych ...

  6. Laravel实践-自定义全局异常处理

    在做API时,需要对一些异常进行全局处理 百牛信息技术bainiu.ltd整理发布于博客园比如添加用户执行失败时,需要返回错误信息 // 添加用户 $result = User::add($user) ...

  7. 详细的Ajax使用

    1. ajax对xml的接收和处理 xml主要作用: 主要保存和传输数据 1. xml文档结构 dom操作xml getElementsByTagName(); //根据标签名获取元素 childNo ...

  8. bootstrap-Glyphicons 字体图标

    使用的方法: 1 引入 font-awesome.css文件 2 fonts文件夹  Bootstrap 假定所有的图标字体文件全部位于 ../fonts/ 目录内(可以在font-awesome.c ...

  9. Task运行带参数的函数

    Task<Int32>   task = Task.Run(() => fun("s", 9)); 函数定义: private Int32 frun(string ...

  10. 020--python函数基础知识考试(包括:函数_递归等知识)

    1.列举布尔值为 False 的值 空,None,0, False, '', [], {}, () 2.写函数: 根据范围获取其中 3 和 7 整除的所有数的和,并返回调用者:符合条件的数字个数以及符 ...