Backbone入門之事件(Backbone.Events)

# Backbone入門之事件(Backbone.Events)

本系列前一篇講述了[Backbone入門之視圖](http://blog.codingplayboy.com/?p=234)鞠值,本篇繼續(xù)講述Backbone事件扯躺。

Backbone事件將事件觸發(fā)所要執(zhí)行的回調(diào)函數(shù)注冊成事件處理句柄,當(dāng)事件發(fā)生時扛吞,就觸發(fā)該函數(shù)。


## Backbone.Events


Backbone.Events可以擴(kuò)展到任何對象上议薪,使其具有綁定和觸發(fā)事件的能力罐孝。在綁定事件的回調(diào)處理函數(shù)之前,不需要定義事件雅任,且可以傳遞參數(shù):


```


? ?var myObj = {};

? ?_.extend(myObj, Backbone.Events);

? ?//添加一個自定義事件

? ?myObj.on('test', function(msg) {

? ? ? ?console.log('triggered ' + msg);

? ?});

? ?//觸發(fā)自定義事件,輸出"triggered test"

? ?myObj.trigger('test', 'test');

```


### on()


on(event, callback [,context])會在對象上綁定一個事件回調(diào)函數(shù)风范,回調(diào)函數(shù)this默認(rèn)指向當(dāng)前對象,事件發(fā)生時,回調(diào)函數(shù)就會被調(diào)用沪么。單一事件時硼婿,第一個參數(shù)event值即為自定義事件名;而多個事件時禽车,則可以為事件加上命名空間寇漫,以冒號分隔刊殉;第三個參數(shù)可以傳入作為回調(diào)函數(shù)執(zhí)行上下文,:


*注:特殊事件all州胳,可以捕獲對象上所有的事件觸發(fā)记焊。*


- 未注冊all事件


? ?```

? ? ? ?var myObj = {};

? ? ? ?_.extend(myObj, Backbone.Events);

? ? ? ?function test(msg) {

? ? ? ? ? ?console.log('triggered ' + msg);

? ? ? ?}

? ? ? ?myObj.on('test:first', test);

? ? ? ?myObj.on('test:second', test);

? ? ? ?//觸發(fā)test:first事件,輸出 "triggered test first"

? ? ? ?myObj.trigger('test:first', 'test first');

? ? ? ?//觸發(fā)test:second事件栓撞,輸出 "triggered test second"

? ? ? ?myObj.trigger('test:second', 'test second');

? ? ? ?//不觸發(fā)任何事件

? ? ? ?myObj.trigger('test', 'test');

? ?```

- 注冊all事件


? ?```

? ? ? ?var myObj = {};

? ? ? ?_.extend(myObj, Backbone.Events);

? ? ? ?function test(msg) {

? ? ? ? ? ?console.log('triggered ' + msg);

? ? ? ?}

? ? ? ?//監(jiān)聽所有事件

? ? ? ?myObj.on('all', test);

? ? ? ?//觸發(fā)test:first事件遍膜,輸出 "triggered test first"

? ? ? ?myObj.trigger('test:first', 'test first');

? ? ? ?//觸發(fā)test:second事件,輸出 "triggered test second"

? ? ? ?myObj.trigger('test:second', 'test second');

? ? ? ?//觸發(fā)test事件瓤湘, 輸出"triggered test"

? ? ? ?myObj.trigger('test', 'test');

? ?```


### once()


注冊事件并綁定回調(diào)處理函數(shù)瓢颅,觸發(fā)一次后立即被移除,其他同on()方法弛说。


### off()


off([event] [,callback] [,context])事件可以移除之前通過on()方法綁定在事件對象上的回調(diào)處理函數(shù)挽懦,第一個參數(shù)為要移除的回調(diào)函數(shù)對應(yīng)的事件名,若為空則移除所有事件的回調(diào)函數(shù)木人;第二個參數(shù)為對應(yīng)的要移除的回調(diào)函數(shù)名信柿,若為空則移除該事件所有綁定的回調(diào)函數(shù):第三個函數(shù)為回調(diào)函數(shù)上下文,若為空則移除所有上下文下的這個回調(diào)函數(shù):


```


? ?var myObj = {};

? ?_.extend(myObj, Backbone.Events);

? ?function test(msg) {

? ? ? ?console.log('triggered ' + msg);

? ?}

? ?function joke(msg) {

? ? ? ?console.log("Joke " + msg);

? ?}


? ?myObj.on('test:first', test);

? ?myObj.on('test:second', test);

? ?myObj.on('joke', test);

? ?myObj.on('joke', joke);

? ?myObj.off('test:first');


? ?//觸發(fā)test:first事件醒第,不輸出

? ?myObj.trigger('test:first', 'test first');

? ?//觸發(fā)test:second事件渔嚷,輸出 "triggered test second"

? ?myObj.trigger('test:second', 'test second');

? ?myObj.off('joke', test);

? ?//觸發(fā)joke事件,輸出"Joke joke"

? ?myObj.trigger('joke', 'joke');

? ?myObj.off('joke');

? ?//觸發(fā)joke事件稠曼,不輸出

? ?myObj.trigger('joke', 'joke');

```


### trigger()

trigger(event [,*args])方法為指定事件觸發(fā)回調(diào)函數(shù)圃伶,第一個參數(shù)為事件名,后面的參數(shù)為傳遞的參數(shù)蒲列,可以為一個或多個窒朋;trigger()方法可以觸發(fā)一個或多個事件的回調(diào)函數(shù),觸發(fā)單個事件時蝗岖,event參數(shù)值即為事件名侥猩;而觸發(fā)多個事件時,event值為以空格分隔的多個事件名:


```


? ?var myObj = {};

? ?_.extend(myObj, Backbone.Events);

? ?function test(arg1, arg2) {

? ? ? ?console.log('triggered ' + arg1 + ' ' + arg2);

? ?}

? ?function joke(msg) {

? ? ? ?console.log("Joke " + msg);

? ?}

? ?myObj.on('test', test);

? ?myObj.on('joke', joke);

? ?//輸出"triggered boy girl"

? ?myObj.trigger('test', 'boy', 'girl');

? ?//輸出"triggered several events undefined"和"Joke several events"

? ?myObj.trigger('test joke', 'several events');

```


### listenTo()


前文的on()和off()都是在對象上直接綁定或移除回調(diào)函數(shù)抵赢,而listenTo(obj, event, callback)方法則可以實現(xiàn)一個對象監(jiān)聽另一個對象上的事件欺劳,第一個參數(shù)是要監(jiān)聽的對象,第二個參數(shù)是要堅聽對象上事件的事件名铅鲤,第三個參數(shù)是所監(jiān)聽對象上事件觸發(fā)時此對象上的回調(diào)函數(shù):


*注:object.listenTo()方法調(diào)用時划提,其第三個參數(shù)回調(diào)函數(shù)執(zhí)行上下文總是當(dāng)前對象object。*


```


? ?var objA = {}, objB = {};

? ?_.extend(objA, Backbone.Events);

? ?_.extend(objB, Backbone.Events);

? ?objA.listenTo(objB, 'test', function(e) {

? ? ? ?console.log('listened it');

? ?});

? ?//輸出"listened it"

? ?objB.trigger('test');

```


### listenToOnce()


listenToOnce(obj, event, callback)方法則可以實現(xiàn)一個對象監(jiān)聽另一個對象上的事件邢享,并在該事件觸發(fā)一次后


### stopListening()


stopListening([other] [,event] [,callback])方法使對象終止監(jiān)聽事件鹏往,若不帶參數(shù),則停止監(jiān)聽所有對象骇塘,移除所有已注冊的回調(diào)函數(shù)伊履;若第二個參數(shù)為空用押,則停止監(jiān)聽某對象上所有事件篙悯,移除為該對象注冊的所有回調(diào)函數(shù)伍纫;若第三個參數(shù)為空噪沙,停止監(jiān)聽某對象上特定事件哄辣,移除為該事件注冊的所有回調(diào)函數(shù);參數(shù)均不為空溢陪,移除某對象上特定事件的指定回調(diào)函數(shù):


```


? ?var objA = {}, objB = {};

? ?_.extend(objA, Backbone.Events);

? ?_.extend(objB, Backbone.Events);

? ?objA.listenTo(objB, 'test', function(e) {

? ? ? ?console.log('listened it');

? ?});

? ?//輸出"listened it"

? ?objB.trigger('test');

? ?objA.stopListening(objB);

? ?//不輸出

? ?objB.trigger('test');

```


## 事件與視圖


在Backbone中,事件使用最多的場景總是與視圖對象一起睛廊,在一個視圖中杉编,要監(jiān)聽事件,一般有兩種方式:DOM事件和Event事件API邓馒。


- DOM事件


? ?添加DOM事件可以通過視圖對象events屬性或者jQuery.on()方法注冊:

? ?- 使用events屬性注冊的事件嘶朱,回調(diào)函數(shù)的this指向視圖對象

? ?- 使用jQuery注冊事件光酣,回調(diào)函數(shù)this指向DOM元素

- Event API


? ?使用Event API注冊事件也有兩種情況:

? ?- 使用on()方法注冊事件,上下文默認(rèn)是指向當(dāng)前對象财异,也可以通過第三個參數(shù)傳入作為回調(diào)函數(shù)上下文

? ?- 使用listenTo()注冊事件唱遭,回調(diào)函數(shù)this指向當(dāng)前對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拷泽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拆吆,更是在濱河造成了極大的恐慌脂矫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娄昆,死亡現(xiàn)場離奇詭異缝彬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扒俯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門撼玄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墩邀,“玉大人,你說我怎么就攤上這事荔茬≈窈#” “怎么了斋配?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坏瞄。 經(jīng)常有香客問我甩卓,道長猛频,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任睦柴,我火速辦了婚禮毡熏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狱窘。我一直安慰自己,他們只是感情好蘸炸,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布搭儒。 她就那樣靜靜地躺著淹禾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汪疮。 梳的紋絲不亂的頭發(fā)上毁习,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天蜓洪,我揣著相機(jī)與錄音坯苹,去河邊找鬼。 笑死恐仑,一個胖子當(dāng)著我的面吹牛为鳄,可吹牛的內(nèi)容都是我干的孤钦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼静袖,長吁一口氣:“原來是場噩夢啊……” “哼队橙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仇矾,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤解总,失蹤者是張志新(化名)和其女友劉穎倾鲫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隙疚,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡供屉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年溺蕉,在試婚紗的時候發(fā)現(xiàn)自己被綠了疯特。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡录别,死狀恐怖邻吞,靈堂內(nèi)的尸體忽然破棺而出抱冷,到底是詐尸還是另有隱情,我是刑警寧澤赵讯,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布耿眉,位于F島的核電站跷敬,受9級特大地震影響热押,放射性物質(zhì)發(fā)生泄漏斤寇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莫秆。 院中可真熱鬧镊屎,春花似錦、人聲如沸连锯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咏连,卻和暖如春砸狞,著一層夾襖步出監(jiān)牢的瞬間镀梭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留透罢,地道東北人羽圃。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像识窿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缩宜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 寫在前面 backbone是我兩年多前入門前端的時候接觸到的第一個框架锻煌,當(dāng)初被backbone的強(qiáng)大功能所吸引(當(dāng)...
    浙大javascript聯(lián)盟閱讀 1,138評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理宋梧,服務(wù)發(fā)現(xiàn)史简,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 總結(jié): 鼠標(biāo)事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,605評論 2 10
  • 驀陽閱讀 154評論 0 1
  • 特別喜歡小孩。你看他們一臉天真地仰著頭创夜,眨巴眨巴著清澈無比的眼睛驰吓,帶著笑望著你。軟乎乎的小手牽著你的手檬贰。你頓時能感...
    huilan2yunqiang閱讀 218評論 0 1