作者: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事件
如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
相关推荐
1.程序功能说明: MATLAB实现多种群遗传算法(完整代码) 逼近C=[9,8,7,6,5,4,3,2,1]的9维向量. 2.代码说明:注释清晰,参数和变量说明清晰,方便更改、方便初学者使用,模块化编程,方便替换目标函数。运行环境Windows7及以上操作系统,MATLAB2014a及以上版本。 3.适用专业:计算机、电子信息工程、数学、物理、机械工程、土木工程等专业的大学生、研究生毕业设计,各类专业的课程设计、海外留学生作业等。 4作者介绍:资深算法工程师, 从事Matlab、Python算法仿真工作15年,专业研究遗传算法、粒子群算法、蚁群算法、鲸鱼算法、狼群算法等. 有问题联系QQ: 1579325979
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
小学元旦晚会PPT 模版
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
MATLAB中的语义分割技术探究与应用实践,matlab,语义分割 ,matlab; 语义分割,Matlab语义分割技术解析
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
1、文件内容:pulseaudio-10.0-6.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pulseaudio-10.0-6.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
"基于OpenCV与深度学习的人脸表情识别系统:利用Python与PyQt构建的可视化实时检测工具",基于OpenCV的人脸表情识别系统 相关技术:python,opencv,pyqt,深度学习 (请自行安装向日葵远程软件,以便提供远程帮助) 可编译为.exe文件。 软件说明:摄像头实时检测,加载照片,视频均可。 有基础的同学,可自行修改完善。 第一张和第二张为运行截图。 ,基于OpenCV的人脸表情识别系统; Python; OpenCV; PyQt; 深度学习; 实时检测; 照片和视频支持; 可编译为.exe文件; 运行截图。,"基于OpenCV与深度学习的人脸表情识别系统"
,步进方案,步进源码,两相步进矢量控制,超前角控制两种模式,成熟产品方案 支持特殊功能定制
三相储能PCS双向能量流动与Matlab仿真控制研究——基于SVPWM调制技术的建模与应用,三相储能PCS(Matlab仿真) 1.可实现Grid to Battery,Battery to Grid的能量双向流动。 2.本仿真基于Matlab仿真建立的模型, 3.采用SVPWM进行控制 ,三相储能PCS; 双向能量流动; Matlab仿真; SVPWM控制,三相储能PCS:能量双向流Matlab仿真模型(SVPWM控制)
deepseek部署教程.md
nodejs010-nodejs-ansicolors-0.3.2-1.el6.centos.alt.noarch.rpm
基于三菱PLC的四路抢答器控制系统原理及实践:含带解释的梯形图与IO分配图解,三菱 MCGS 基于PLC的四路抢答器控制系统 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,三菱MCGS; PLC四路抢答器; 控制系统; 梯形图接线图; 原理图图纸; IO分配; 组态画面。,三菱PLC四路抢答器控制系统原理图及组态画面解析
基于运动数据时空特征提取的人类运动片段.pdf
基于机器学习的选股模型及投资组合研究.pdf
ollama安装包。。。。。。。。。。。。。。。。。
nodejs010-nodejs-ansistyles-0.1.3-1.el6.centos.alt.x86_64.rpm
Screenshot_20250201_111207_com_tencent_mm_LauncherUI.jpg
基于时空Transformer的端到端的视频注视目标检测.pdf