`
zccst
  • 浏览: 3322425 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Backbone的监听事件

阅读更多
作者:zccst

之前简单熟悉了一下,看了一两个例子,就以为已经掌握了,就停滞不前了。

直到在项目中真正用到,才知道自己是多么无知。下定决心:
首先,彻底完整看一遍手册(期间也是相当痛苦的,没有一气呵成的流畅?是不是老了?)
其次,是看Todo实例。

当我一点点录入,并在TodoView和Appview的render方法中分别console.log(xx)过程中才有那么一点点进步。

下面就记录对backbone逐渐深入的理解:

backbone本身的结构并不难理解,分别是(根据Todo实例)
//模型
var model = Backbone.Model.extend({
    validate:function(){}
});
//集合
var Collect = Backbone.Collection.extend({
    model : model,
    comparator:function(){},//比较器,方便model排序
    method1:function(){},
    method2:function(){}
});
var lists = new Collect;//创建集合对象

//某一个元素视图
var itemView = Backbone.View.extend({
    tagName:"li",
    template:_.template($("#xx").html()),
    events:{
        "click #edit":edit,
        "click #del":del
    },
    initialize:function(){//初始化:绑定dom元素,监听事件等
        this.listenTo(this.model, "change", render);
        this.listenTo(this.model, "destroy", this.remove);//直接删除DOM节点
    },
    render:{
        //渲染当前item
        return this;//在页面渲染时会用到
    },
    edit:function(){},
    del:function(){}
});
//页面视图
var AppView = Backbone.View.extend({
    el:$("#"),//
    template:_.template($("#xx").html()),
    events:{
        "click #create":createOnEnter,
    },
    initialize:function(){//初始化:绑定dom元素,监听事件等
        this.listenTo(lists, 'add', addOne);
        this.listenTo(lists, '', method1);
        this.listenTo(lists, '', method2);
    },
    render:{
        //渲染除item外的其他部分
    },
    createOnEnter:function(e){//events中绑定的,参数是event
        lists.create({keyName:value});//触发Collection的add事件
    },
    addOne:function(model){//initialize中绑定的,参数是model
        var view = new itemView(model:model);
        this.$el.append(view.render().el);//相当于是itemView渲染后的el。
    },
    method1:function(){},
    method2:function(){}
});



然而上面的逻辑并不难理解,较难的是集合和模型在增删查改时触发的事件,这使我眼花缭乱,特别是all。


比如:较难理解的几个事件:
1,Todos.fetch()方法到底做了什么?
经验证:
没有触发集合change事件
没有触发集合reset事件
没有触发集合remove事件
有触发集合的add事件,而且是逐一取出的
而add在AppView的initialize里监听了两次。一次是渲染AppView的addOne(逐个加载每一个item),另一次是渲染AppView的render(逐次计算done和remaining)

推理:也没有触发model的change和destroy事件。

2,勾选TodoView中的checkbox事件
由于调用了model的save()方法,所以触发了Collection的change(由于change绑定TodoView的render,所以会重新渲染)

由于model发生了变化,Collection也相应感知,所以也触发了Collection的change事件(由于change绑定AppView的render,所以会重新渲染)


3,删除TodoView中的li
this.model.destroy();//从model中销毁

触发destroy事件
this.listenTo(this.model, 'destroy', this.remove);//删除DOM节点,自己消失

从model中销毁又关联触发Collection的remove事件
this.listenTo(Todos, 'remove', this.render);//底部统计计算

4,创建一个新的
Todos.create({title:this.input.val()});

触发Collection的add事件,调用addOne(带着item,添加到页面)和AppView的render(底部渲染后)

model增加,再触发itemView的change事件,调用render。

集合增加,再触发AppView的change事件,调用render。


5,全部删除
_.invoke(Todos.done(), 'destroy');//清除所有被选中的(done:true的)
var arr = Todos.done();for(var item in arr){ arr[item].destroy(); };

首先,model物理删除。
触发model的destroy事件,remove当前Dom节点
冒泡触发Collection的remove事件,调用render(计算底部统计)。


6,全选
var done = this.allCheckbox.checked;
Todos.each(function(todo){ todo.save({'done':done}); });

依次save每一个model,监听change事件,调用TodoView的render方法
model的change传感给Collection的change事件,调用AppView的render方法。



下面的总结相当于是手册,供忘记时查询:

监听model事件有:
change:set  (如果修改了model状态时触发)
	unset  去除某个属性 
	clear  去除全部属性      
	save (保存新的属性值时触发)如果只保存改变的属性{attrs:{patch:true}}
	fetch(当服务器端与当前不一致时触发)
destroy:destroy方法触发destroy事件后,会继续冒泡至Collection的remove事件




监听Collection事件有:
add    : fetch(新增时), set(新增时), add({merge:true}时), create
change : fetch(修改时), set(修改时), add
remove : fetch(删除时), set(model被删时), remove
reset  : reset
/*
批注1:add只有在{merge:true}才会触发change事件
批注2:fetch会“智能”合并,除非你设置{merge:false},此时会reset
     后端新增时,fetch才触发add事件
     后端修改时,fetch才触发change事件
     fetch({remove:false})不移除,{remove:true}时才触发remove事件
批注3:set可以通过{add:false},{remove:false},{merge:false}使不触发对应事件*/

//特殊事件 "all"  会在任意事件发生时被触发
all

AppView中initialize的add, change, remove 加起来基本可以相当于all事件了。

reset的使用场景:
1,调用fetch()方法时加了{reset:true}时触发reset事件
2,直接reset({...});时触发reset事件




与之同时,两者之前的关系是:
model的change事件都会引起Collection的change事件。
model的destroy事件会引起Collection的remove事件。

批注:两者引起是不交叉的
model的change不会引起Collection的remove事件
model的destroy不会引起Collection的change事件


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
评论

相关推荐

    Backbone.js的事件绑定

    首先,事件绑定是Backbone.js中一个至关重要的功能,它允许对象之间通过发布和监听事件进行交互。这种解耦的通信方式使得代码更加灵活,减少了各部分之间的直接依赖。Backbone对象,包括Model、View、Collection,都...

    backbone 资料

    你可以将服务器端的数据映射到Backbone Model,通过事件监听和变更来保持数据的一致性。例如,当你更新Model的属性时,Backbone会自动触发change事件,允许你监听并响应这些变化。 View是用户界面的代表,它负责...

    深入解析JavaScript框架Backbone.js中的事件机制

    例如,我们可以通过`_.extend({}, Backbone.Events)`创建一个新的对象,然后在这个对象上添加监听和触发事件的功能。如以下代码所示: ```javascript var model = _.extend({}, Backbone.Events); var view = _....

    BackBone介绍及使用

    模型还支持事件监听,当数据发生变化时,可以触发相应的事件。 2. **Collection**:集合是一组模型的容器,它扩展了Backbone.Model的功能,提供了对一组模型的操作,如排序、筛选等。集合同样拥有自己的URL,可以一...

    Backbone.js(1.1.2) API中文文档.zip Backbone.js离线文档

    3. **集合(Collections)**:集合是模型的有序列表,它们继承自Backbone.Events,因此可以触发和监听事件。集合有自己的URL,可以进行同步操作,如`fetch`和`create`。集合中的模型可以通过比较ID来保持唯一性。 4...

    实例讲解JavaScript的Backbone.js框架中的View视图

    当需要为视图添加DOM事件监听器时,可以在View的events属性中定义,然后Backbone.js会自动将这些事件与对应的回调函数关联起来。重要的是,这些事件监听器只能被添加到el属性指定的DOM元素的子元素上。这样可以确保...

    backbone中文api

    6. **事件(Event)**: Backbone的事件系统是其核心特性之一,模型、视图和集合都可以触发和监听事件,实现组件之间的通信。例如,模型的`change`事件可以在视图中监听并更新界面。 7. **同步(.sync)**: 这是一个抽象...

    backbone学习例子-可编辑的表格

    8. **初始化与实例化**:在实际应用中,你需要创建Backbone对象的实例,比如`new Backbone.Model()`或`new Backbone.View()`,并设置相应的属性和事件监听。同时,你还需要设置全局的Backbone.history.start()来启动...

    Java 演示 backbone 基本用法

    Model负责存储数据,并提供了监听和处理数据变化的方法。开发者可以定义Model的属性和事件,当模型数据发生变化时,可以触发相应的事件,更新视图。 2. **Backbone.View**: 视图是展示用户界面的部分,通常与Model...

    backbone 和bootstrap 登录示例项目

    Backbone.View通过监听Model的事件来更新视图,例如当用户提交登录信息时,View会触发一个事件,Model进行验证,然后返回结果更新View的状态。 2. **Backbone.Router** Router是Backbone中处理URL路由的部分,...

    backbone 实例

    每个View通常关联一个Model或Collection,当Model的数据改变时,View可以通过监听事件自动更新。例如: ```javascript var UserView = Backbone.View.extend({ el: "#user-info", initialize: function() { this...

    透过源码学前端 之 Backbone 一

    任何Backbone对象都可以触发和监听事件,使得组件间可以通过事件来传递信息,而不是直接依赖于对象实例。 在压缩包中的"backbone分析第一部分.js"文件,很可能是对Backbone源码的一部分分析。可能包含的内容有对...

    Backbone.js实战.zip

    任何Backbone对象都可以触发和监听事件,增强了代码的模块化和解耦。 "文前.pdf"通常会包含前言、目录等内容,可能涉及作者对Backbone.js的理解、学习该框架的重要性以及书中章节的概述。这部分将帮助读者更好地...

    backbone_js_1.1.2

    视图可以通过事件委托来处理用户操作,这样可以减少事件监听器的数量,提高应用性能。 集合(Collections)是一组模型的容器,它们拥有自己的方法,如排序、过滤和检索,同时集合并提供了一种与服务器通信的方式,...

    backbone官方Todo示例_修正

    4. **事件绑定**:Backbone使用观察者模式,允许视图监听模型或集合的事件。例如,当用户点击删除按钮时,`TodoView`可以监听`Todo`模型的`destroy`事件,从而触发视图的销毁。 5. **路由(Router)**:Backbone的...

    backbone.js underscore.js

    5. **事件(Event)**:Backbone.js内置了一个事件系统,允许对象之间进行通信,降低了对象之间的耦合度。 **Underscore.js** Underscore.js是一个实用工具库,它提供了大量函数式编程的辅助方法,使得JavaScript...

    backbone官方实例

    Backbone的视图通过事件委托机制来减少DOM操作,提高性能。你可以学习如何绑定视图到特定的模型,以及如何响应用户事件并更新视图。 3. **集合(Collection)**: 集合是模型的集合,提供了一组便捷的方法来操作和管理...

    基于bootstrap样式和backbone的常用UI封装

    View负责监听事件、更新DOM以及与模型进行通信。 2. **HTML模板**:利用Bootstrap的模态框HTML结构,创建一个模板。这可能包括`<div class="modal">`,`<div class="modal-dialog">`和`<div class="modal-content">...

    用Backbone.js写的小项目

    在这个项目中,Model、View和Collection都可以触发和监听事件,例如当Model的数据改变时,可以自动通知关联的View更新界面。 6. **Templating**: Backbone.js不内置模板引擎,但支持与外部模板库(如Underscore.js...

Global site tag (gtag.js) - Google Analytics