天天看点

Backbone源码分析(三)

<a href="http://www.cnblogs.com/dojo-lzz/p/5361627.html">backbone源码分析(一)</a>

<a href="http://www.cnblogs.com/dojo-lzz/p/5374218.html">backbone源码分析(二)</a>

backbone中主要的业务逻辑位于model和collection,上一篇介绍了backbone中的model,这篇文章中将主要探讨collection的源码。

让我们先来看一下collection的构造函数:

接下来是在<code>set</code>, <code>add</code>, <code>remove</code> 中经常用到的<code>splice</code>函数:

下面我们来讲解<code>set</code>函数,<code>set</code>函数是collection中非常重要的一个函数,集增删改查与一身,处理了大量的核心业务逻辑:

collection中存储model的属性有两个:<code>this.models</code>数组和<code>_byid</code>键值对,所有的增删改查都需要对这两个属性进行更新。

set函数中主要做了以下几件事情:

将models参数处理成<code>model</code>的实例数组

处理options中的at参数,将其变成一个合理的数字

声明变量<code>set</code>, <code>toadd</code>, <code>tomerge</code>, <code>toremove</code>, <code>modelmap</code>

遍历models参数,找出其中应当更改或者加入到collection中的model并添加到上文的变量中

从collection的<code>this.models</code>中删除不存在本次set中的model

统一更改collection中的<code>this.models</code>数组

排序,但不要触发sort事件

统一处理事件: add、sort、update事件

像<code>add</code>函数内部就是利用<code>set</code>函数来处理的:

继<code>add</code>之后,另一个重要的操作就是remove,collection中的remove逻辑由<code>remove</code>, <code>_removemodels</code>, <code>_removereference</code> 三个函数完成

remove整体逻辑如下:

处理models参数

从<code>this.models</code>与<code>_byid</code>中删除model,触发collection的remove事件

断开model与collection的关联,移除model的绑定事件

触发collection的update事件

与<code>_removereference</code>对应的是<code>_addreference</code>,它的作用于<code>_removerenence</code>相反:

最后要提一下的是reset函数:

继续阅读