亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

Backbone View 之間通信的三種方式

2019-11-20 09:16:41
字體:
來源:轉載
供稿:網友

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

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

我正在開發的這個網頁主要有兩部分,分別是 document 和 sidebar。

 

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

 

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

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

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

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

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

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

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 stuffthis.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 中添加一個額外的事件處理函數 documentEdited() 。如果子視圖有一堆事件傳過來,則在父視圖中會不斷觸發事件處理函數,導致它不堪重負。

那么來看看第二種方法。

2. 通過 EventBus 在視圖間通信

我通過繼承 Backbone.Events 來創建一個全局對象 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 ,就可以通過它方便地觸發或監聽事件了。

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

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

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

在第二種方法中,我創建了一個單獨的 EventBus ,繼承自 Backbone.Events 。但最近我悟到 Backbone 對象本身就是一個混合了 Events 的對象,所以我直接用 Backbone 廣播事件,就無需單另創建的 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 對象,但是用起來卻異常簡潔。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内揄拍国内精品少妇国语| 成人亚洲激情网| 久久香蕉国产线看观看av| 日韩精品中文在线观看| 成人性生交大片免费看视频直播| 午夜免费在线观看精品视频| 91精品成人久久| 欧亚精品中文字幕| 欧美日韩中文字幕日韩欧美| 国产精品成人一区二区三区吃奶| 久久99热这里只有精品国产| 亚洲国产精品网站| 久久久女人电视剧免费播放下载| 亚洲男人天堂视频| 中文字幕亚洲天堂| 亚洲欧美一区二区激情| 欧美成人精品激情在线观看| 最近免费中文字幕视频2019| 国产精品一区二区久久国产| 亚洲三级黄色在线观看| 亚洲无限乱码一二三四麻| 全色精品综合影院| 亚洲精品女av网站| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品吴梦梦| 国产精品自产拍在线观| 精品国产一区二区三区四区在线观看| 57pao国产成人免费| 成人女保姆的销魂服务| 亚洲欧洲一区二区三区在线观看| 久久国产一区二区三区| 亚洲男子天堂网| 久久成人精品视频| 日韩精品在线免费观看| 庆余年2免费日韩剧观看大牛| 国产精品福利网| 午夜精品久久久久久久久久久久久| 91在线视频精品| 日韩极品精品视频免费观看| 亚洲成人久久久久| 精品福利樱桃av导航| 午夜精品福利视频| 日韩亚洲欧美成人| 亚洲天堂影视av| 黄网动漫久久久| 9.1国产丝袜在线观看| 亚洲**2019国产| 久久久国产精品免费| 一区二区三区视频观看| 久久久91精品| 国产成人鲁鲁免费视频a| 欧亚精品在线观看| 欧美超级免费视 在线| 亚洲欧美国产制服动漫| 中文字幕亚洲情99在线| 亚洲自拍欧美另类| 久久精品男人天堂| 色av吧综合网| 国产精品嫩草视频| 欧美大片大片在线播放| 日韩成人在线电影网| 亚洲欧美精品在线| 中文字幕视频一区二区在线有码| 日韩成人xxxx| 日韩www在线| 超在线视频97| 国产综合久久久久久| 国产一区二区丝袜| 午夜精品久久久久久久久久久久久| 亚洲va电影大全| 亚洲一区二区三| 欧美乱大交做爰xxxⅹ性3| 亚洲最大福利视频网站| 国产一区二区三区在线视频| 久久久久免费精品国产| 正在播放国产一区| 中文字幕日本精品| 久久精视频免费在线久久完整在线看| 日本视频久久久| 欧美日韩国产色| 久久精品视频在线| 麻豆成人在线看| 久久亚洲精品视频| 1769国内精品视频在线播放| 在线午夜精品自拍| 国产精品欧美亚洲777777| 国产精品黄页免费高清在线观看| 欧美精品成人在线| 91精品视频免费观看| 国产精品h在线观看| 欧美日韩亚洲天堂| 在线看日韩av| 少妇精69xxtheporn| 国产亚洲人成网站在线观看| 精品国产户外野外| 国产日韩精品入口| 国产日韩欧美在线播放| 亚洲free嫩bbb| 欧美视频在线视频| 琪琪亚洲精品午夜在线| 亚洲国产精品电影| 成人精品一区二区三区电影黑人| 亚洲国产精品999| 黑人巨大精品欧美一区二区三区| xvideos国产精品| 精品久久久久久久久久国产| 国内精品久久久久影院 日本资源| 亚洲自拍小视频| 国内精久久久久久久久久人| 久久久免费观看视频| 国产亚洲精品久久久优势| 久久99精品久久久久久琪琪| 欧美成人网在线| 亚洲男人天堂2023| 成人伊人精品色xxxx视频| 国产精品青青在线观看爽香蕉| 亚洲欧美日韩中文视频| 91色视频在线导航| 国产狼人综合免费视频| 国产精品欧美日韩| 欧美视频第一页| 欧美贵妇videos办公室| 日韩高清av一区二区三区| 日韩av有码在线| 日韩在线视频播放| 亚洲天堂男人的天堂| 欧美日韩中国免费专区在线看| 77777亚洲午夜久久多人| 日韩一区二区三区在线播放| 欧美高清视频免费观看| 国产成人久久久精品一区| 国产精品av免费在线观看| 亚洲自拍偷拍网址| 亚洲人午夜精品免费| 日韩中文字幕免费视频| 亚洲天堂精品在线| 日韩二区三区在线| 久久精品久久久久久国产 免费| 亚洲国产欧美久久| 久久这里只有精品99| 欧洲亚洲女同hd| 欧美性猛交xxxx富婆弯腰| 欧美猛交ⅹxxx乱大交视频| www.欧美三级电影.com| 国产日本欧美视频| 欧美乱妇40p| 国产欧美精品日韩精品| 亚洲精品成人久久电影| 成人免费视频97| 亚洲free性xxxx护士白浆| 538国产精品视频一区二区| 亚洲国产精品成人一区二区| 国产97色在线|日韩| 亚洲精品99久久久久中文字幕| 亚洲精品丝袜日韩| 亚洲深夜福利网站| 亚洲a在线播放| 美女视频黄免费的亚洲男人天堂| 欧美老女人xx| 国产精品视频自拍| 国产成人精彩在线视频九色| 最近2019中文免费高清视频观看www99| 精品久久久久人成| 91视频九色网站|