最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Backbone View 之間通信的三種方式

 更新時間:2016年08月09日 11:12:31   投稿:mrr  
Backbone View 之間通信有三種,分別是通過父視圖傳遞事件,通過 EventBus 在視圖間通信,直接用 Backbone 作為事件注冊機,本文對這三種通信方式逐一詳細介紹,感興趣的朋友一起學習

在上篇文章給大家介紹了Backbone中View之間傳值的學習心得。本文重點給大家介紹Backbone View 之間通信的三種方式。

掌握一個 MVC 框架,最關鍵的一節(jié)就是掌握如何在各個 View 之間通信。之前用 Angular 時,覺得基于事件的通信方式 ($on, $emit, $boardcast) 或者 基于 service 的方式都非常好用。轉戰(zhàn) Backbone 之后,由于對 Backbone 的事件機制理解不夠且使用非常靈活,一直沒找到一個好的通信方式。直到看見這篇文章,作者通過一個簡單的例子,層層深入,把 Backbone View 之間通信的三種方式講的清晰明了。譯文如下:

我正在開發(fā)的這個網(wǎng)頁主要有兩部分,分別是 document 和 sidebar。

 

如上圖所示,我設立了三個視圖 (view) :

 

ApplicationView - 作為最外層視圖來包含下級視圖

DocumentView - 展示正在編輯或瀏覽的內容

SidebarView - 展示一些和 document 相關的信息

DocumentView 和 SidebarView 作為 ApplicationView 的子視圖,所以整體的視圖結構如下圖所示:

用戶在任意一個子視圖進行操作,另一個子視圖都需要隨之變化。但由于兩個子視圖之間并不能直接通知對方(也就是說,它們的作用域沒有直接聯(lián)系,不像父視圖,可以包含它所有子視圖的作用域),所以,我需要一個事件機制。

在我谷歌和參考其他人的方法之后,我總結出了如下三種不同的通信方式。

1. 通過父視圖傳遞事件

我通過父視圖 ( ApplicationView ) 來為它的兩個子視圖傳遞事件。因為父視圖包含它所有子視圖的作用域,因此用它作為事件傳遞的媒介最好不過。

 

JavaScript 代碼如下:

var ApplicationView = Backbone.View.extend({
initialize : function(){
this.documentView = new DocumentView({parent:this});
this.sidebarView = new SidebarView({parent:this});
this.documentView.on('edit', this.documentEdited, this);
},
documentEdited : function(){
// do some stuff
this.sidebarView.trigger('documentEdit');
}
});
var DocumentView = Backbone.View.extend({
onEdit : function(){
this.trigger('edit');
}
});
var SidebarView = Backbone.View.extend({
initialize : function(){
this.on('documentEdit', this.onDocumentEdit, this);
},
onDocumentEdit : function(){
// react to document edit.
}
});

但是,這種方法并不高效。因為我需要在 ApplicationView 中添加一個額外的事件處理函數(shù) documentEdited() 。如果子視圖有一堆事件傳過來,則在父視圖中會不斷觸發(fā)事件處理函數(shù),導致它不堪重負。

那么來看看第二種方法。

2. 通過 EventBus 在視圖間通信

我通過繼承 Backbone.Events 來創(chuàng)建一個全局對象 EventBus 。把它注入到各個子視圖中,用來廣播事件。

 

JavaScript 代碼如下:

var ApplicationView = Backbone.View.extend({
initialize : function(){
this.eventBus = _.extend({}, Backbone.Events);
this.documentView = new DocumentView({
eventBus : this.eventBus
});
this.sidebarView = new SidebarView({
eventBus : this.eventBus
});
},
});
var DocumentView = Backbone.View.extend({
initialize : function(options){
this.eventBus = options.eventBus;
},
onEdit : function(){
this.eventBus.trigger('documentEdit');
}
});
var SidebarView = Backbone.View.extend({
initialize : function(options){
this.eventBus = options.eventBus;
this.eventBus.on('documentEdit', this.onDocumentEdit, this);
},
onDocumentEdit : function(){
// react to document edit.
}
});

在這個方法中,我把 EventBus 作為一個全局對象用來注冊事件。如果我想在各個視圖之間通信,只需要在視圖中注入 EventBus ,就可以通過它方便地觸發(fā)或監(jiān)聽事件了。

注意:如果你不想要創(chuàng)建全局對象,你仍然可以創(chuàng)建模塊 (module) 或視圖 (view) 級別的 EventBus 用來通信。

這個方法已經(jīng)明顯優(yōu)于第一種方法了。但是需要我們手動的在子視圖中引入 EventBus ,說明還有可以改進的空間,那么,來看看第三種方法。

3. 直接用 Backbone 作為事件注冊機

在第二種方法中,我創(chuàng)建了一個單獨的 EventBus ,繼承自 Backbone.Events 。但最近我悟到 Backbone 對象本身就是一個混合了 Events 的對象,所以我直接用 Backbone 廣播事件,就無需單另創(chuàng)建的 EventBus 了。

而且 Backbone 對象可以直接調用,這樣我就不必在每個子視圖中手動注入它了。

 

JavaScript 代碼如下:

var ApplicationView = Backbone.View.extend({
initialize : function(){
this.documentView = new DocumentView();
this.sidebarView = new SidebarView();
},
});
var DocumentView = Backbone.View.extend({
onEdit : function(){
Backbone.trigger('documentEdit');
}
});
var SidebarView = Backbone.View.extend({
initialize : function(options){
Backbone.on('documentEdit', this.onDocumentEdit, this);
},
onDocumentEdit : function(){
// react to document edit.
}
});

總結

我最終在我的項目中使用了第三種方法。而且在我看來,雖然它直接依賴了全局的 Backbone 對象,但是用起來卻異常簡潔。

相關文章

  • BACKBONE.JS 簡單入門范例

    BACKBONE.JS 簡單入門范例

    Backbone簡單、靈活,無論是富JS應用還是企業(yè)網(wǎng)站都用得上,相比React針對View和單向數(shù)據(jù)流的設計,Backbone更能體現(xiàn)MVC的思路,所以針對它寫一篇入門范例,需要的朋友可以參考下
    2017-10-10
  • JavaScript的Backbone.js框架入門學習指引

    JavaScript的Backbone.js框架入門學習指引

    這篇文章主要介紹了JavaScript的Backbone.js框架入門學習指引, 其中特別講到了Backbone中的關鍵部分Router路由器,需要的朋友可以參考下
    2016-05-05
  • 深入解析JavaScript框架Backbone.js中的事件機制

    深入解析JavaScript框架Backbone.js中的事件機制

    這篇文章主要介紹了JavaScript框架Backbone.js中的事件機制,其中涉及到Backbone的MVC結構及內存使用方面的很多知識,需要的朋友可以參考下
    2016-02-02
  • Backbone.js 0.9.2 源碼注釋中文翻譯版

    Backbone.js 0.9.2 源碼注釋中文翻譯版

    Backbone.js為復雜WEB應用程序提供模型(models)、集合(collections)、視圖(views)的結構。其中模型用于綁定鍵值數(shù)據(jù)和自定義事件;集合附有可枚舉函數(shù)的豐富API; 視圖可以聲明事件處理函數(shù),并通過RESRful JSON接口連接到應用程序。
    2015-06-06
  • Backbone.js中的集合詳解

    Backbone.js中的集合詳解

    這篇文章主要介紹了Backbone.js中的集合詳解,本文著重講解Backbone.js的集合和其它組件的關系,需要的朋友可以參考下
    2015-01-01
  • JavaScript的Backbone.js框架的一些使用建議整理

    JavaScript的Backbone.js框架的一些使用建議整理

    這篇文章主要介紹了JavaScript的Backbone.js框架的一些使用建議整理,文中列的幾點主要還是針對DOM方面的操作,需要的朋友可以參考下
    2016-02-02
  • Backbone中View之間傳值的學習心得

    Backbone中View之間傳值的學習心得

    Backbone中的View就是用來展示由Model層傳出的數(shù)據(jù),或者在View里產(chǎn)生的一些數(shù)據(jù),本文給大家介紹Backbone中View之間傳值的解決方法,感興趣的朋友一起看下吧
    2016-08-08
  • Backbone.js的一些使用技巧

    Backbone.js的一些使用技巧

    這篇文章主要介紹了Backbone.js的一些使用技巧,Backbone.js是一款人氣JavaScript庫,需要的朋友可以參考下
    2015-07-07
  • require、backbone等重構手機圖片查看器

    require、backbone等重構手機圖片查看器

    這篇文章主要為大家詳細介紹了require、backbone等重構手機圖片查看器的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 深入解析Backbone.js框架的依賴庫Underscore.js的作用

    深入解析Backbone.js框架的依賴庫Underscore.js的作用

    這篇文章主要介紹了深入解析Backbone.js框架的依賴庫Underscore.js的作用,用過Node.js的朋友對Underscore一定不會陌生:)需要的朋友可以參考下
    2016-05-05

最新評論

临泉县| 绥棱县| 大余县| 永春县| 社旗县| 岳西县| 福贡县| 随州市| 常州市| 乐陵市| 佛学| 阿拉善盟| 论坛| 靖安县| 龙井市| 毕节市| 松阳县| 安多县| 鲜城| 凤阳县| 淮阳县| 扎赉特旗| 长武县| 林芝县| 榕江县| 武隆县| 神木县| 富宁县| 荣昌县| 吴江市| 子长县| 遂昌县| 达孜县| 新建县| 琼中| 开远市| 玉山县| 新民市| 大埔县| 忻城县| 西安市|