天天看點

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函數:

繼續閱讀