從 BackboneJS 的源碼開始說事件模型

爲何要事件模型

先從 BackboneJS 開始提及。BackboneJS 設計的比較好的一部分代碼就是事件相關的內容,傳送門:
http://backbonejs.org/docs/backbone.html#section-13javascript

jQuery 裏面用到最多的就是bind相關的操做,爲一個按鈕綁定點擊事件,給他解綁一個事件或者解綁全部事件,這一類的事件都是面向Dom對象。富應用中還須要一類孤立於DOM的事件,他們也須要相似添加事件、刪除事件、解綁事件和觸發事件。例如監測URL的變化,在其餘地方可能綁定了不少事件,可是真實變化的時候只須要觸發一下邊能執行全部方法。html

事件模型的代碼

最終我本身框架裏面寫的事件很大部分參考了 BackboneJS ,具體代碼傳送門:
https://github.com/vincenting/HaiyiYun/blob/master/src/vintjs.js#L175java

主要的功能包括綁定 on ,解綁 off ,觸發 trigger 。on 最終期待的參數是(事件名稱,回調函數,回調函數上下文),off最終期待的參數是(事件名稱[,回調函數][,回調函數上下文]),trigger 最終期待的參數是(時間名稱[,args...])。可是爲了靈活,還須要一些靈活的參數,例如時間名稱容許是多個事件名稱以空格分開,以及以對象的形式同時傳入名稱和回調函數。因而 BackboneJS 中使用了eventsApi 進行統一的處理。git

題外話-內存潔癖

Javascript 裏面寫[]其實是 new Array,所以很容易無心中產生不少使用很臨時的列表對象,例如一些臨時列表,做爲參數使用 apply 傳遞給函數。對於一個列表來講,最快的清空方法就是修改他的length,以下github

var arr = [1,2,3,4];
arr.length = 0;
console.log(arr);

以後 arrObj 內容便會被釋放。這樣的對象能夠屢次使用,可是非臨時的變量必定不能使用。緣由以下:app

var arr = [1,2,3,4];
var new_list = arr;
arr.length = 0;
console.log(new_list[0]);

相同的 Object 也能夠運用相似的方法來重複使用。這些都是爲了儘可能減小對象的新建,頁面一直開着什麼狀況都有可能發生,其餘對象也是如此,字符串、函數、正則對象。框架

可能用到事件的地方

  • 以前有提到的url變化的時候會觸發事件,這些事件可能包括去尋找對應的路由並解析,對當前狀態存在的事件統一解綁,刪除Dom等等。
  • 控制器間的通訊也會用到事件模型。一個控制器中觸發了一個事件,而後事件被觸發去和其餘控制器通訊。
  • 數據和視圖的綁定也須要使用事件。一個數據更新了調用什麼方法去更新視圖,一個列表刪除或者添加數據了又去調用什麼方法去更新視圖。
  • 還有就是系統內部的解耦等等。

完成事件以後就須要去監聽url的變化而且解析,以及一些相似於後臺的url處理方法。(更新待續)函數

相關文章
相關標籤/搜索