Flex Viewer 解析(五)Widget之間通訊
雖然每個Widget都是封裝良好的一個元件,提供一組針對特定業務功能的操作,但是有時候需要Widget之間的彼此協作來完成一個粒度更大的業務邏輯。此時就需要Widget之間的互動,或者說通訊。經常看到這樣的問題“一個Widget如何呼叫另外一個Widget的方法?”。Widget之間彼此相互獨立,互不知曉,“一個Widget呼叫另一個Widget的方法”意味著兩個Widget緊密地耦合在了一起,這不符合“鬆耦合”的要求。那麼Widget之間該如何互動呢?答案還是事件!還記得ViewerContainer的addEventListener()和dispatchEvent()方法麼?ViewerContainer通過EventBus新增監聽和派發事件,使各模組默契協作。
5.1 直接通訊
直接通訊是指Widget A監聽某一事件E,Widget B在任何時間派發了事件E,Widget A都能夠捕捉到這個事件,並進行響應。當然,這裡對事件的監聽和捕捉都是通過ViewerContainer代理的EventBus實現的,參見圖5.1。我們注意到,Widget A與Widget B除了通過全域性的EventBus監聽、派發、捕捉事件外,沒有發生任何直接的聯絡。
圖 5.1 Widget之間直接通訊
① Widget A通過EventBus監聽事件E;
② Widget B通過EventBus派發事件E;
③ Widget A通過EventBus捕捉事件E,並進行響應。
5.2 間接通訊
直接通訊有一個前提條件,那就是必須互動的兩個Widget都已經被載入。Widget採用lazy-load的載入方式,也就是隻有第一次開啟的時候才會載入。如果Widget B已經載入並派發了事件E,而此時Widget A還並未載入,Widget A是無法捕捉並響應事件E的,因為Widget A在記憶體中還不存在。
此時的解決方法是通過DataManager間接通訊。DataManager響應Widget B派發的事件,並資料儲存起來,Widget A在第一次載入時通過DataManager獲取Widget B共享的資料,以此可以達到通訊的目的,參見圖5.2。同樣的,Widget A與Widget B,以及兩者與DataManager之間並未直接互動,所有的協作都通過事件來完成。
① DataManager通過EventBus監聽共享資料事件和獲取資料事件;
② Widget B派發共享資料事件;
③ DataManager響應共享資料事件,將資料以key-value的形式儲存;
④ Widget A監聽分發資料事件,並且派發獲取資料事件;
⑤ DataManager響應獲取資料事件,查詢Widget A所需資料,派發分發資料事件;
⑥ Widget A響應分發資料事件,並做相應的響應動作。
DataManager是Flex Viewer為模組之間共享資料和儲存共享資料設計的一種解決方案。DataManager將各個模組需要共享出來的資料儲存在記憶體中,一旦某個模組需要獲取共享資料,派發一個訊息即可,DataManager會響應這個訊息,並共享資料作為訊息的載體派發出去。
DataManager響應的事件
u DATA_FETCH_ALL:獲取資料事件(全部資料)
u DATA_PUBLISH:共享資料事件
u DATA_FETCH:獲取資料事件(根據key獲取資料)
DataManager派發的事件
u DATA_SENT:分發資料事件
u DATA_NEW_PUBLISHED:當有新的資料被共享時,將新資料分發出去
相關文章
- Flex Viewer 解析(四)自定義WidgetFlexView
- Flex Viewer 解析(三)Flex Viewer架構解析FlexView架構
- Flex Viewer 解析(一)Flex Viewer簡介FlexView
- Flex Viewer 解析(二)Flex Viewer原始碼包結構FlexView原始碼
- Flex Viewer 開發教程(5)Widget與Widget互動FlexView
- Flex Viewer 開發教程(3)Widget與WidgetTemplateFlexView
- Flex Viewer 開發教程(2)Widget配置檔案FlexView
- Flex Viewer 開發教程(6)Widget與共享資料FlexView
- Flex Viewer 開發教程(4)Widget與Map互動FlexView
- Flex Viewer 解析 完整版 (pdf + source code)FlexView
- Flex Viewer 開發教程(7)Widget與伺服器互動FlexView伺服器
- Flex Viewer 開發教程(1)Flex Viewer配置檔案FlexView
- 深入解析Vue元件間通訊Vue元件
- 父子元件之間通訊元件
- 微服務之間通過RabbitMQ通訊微服務MQ
- vue元件之間的通訊Vue元件
- Android 程式之間通訊Android
- webRtc及元件之間通訊Web元件
- Activity之間的通訊方式
- iOS app之間通訊方式iOSAPP
- React - 元件之間的通訊React元件
- 程式間的五種通訊方式介紹
- iOS App間常用的五種通訊方式iOSAPP
- Flutter Widget之TextField使用解析Flutter
- linux 程式間通訊之FIFOLinux
- vue中兄弟之間元件通訊Vue元件
- 元件之間的通訊LiveDataBus元件LiveData
- VLAN之間單臂路由通訊路由
- Flutter多Engine之間的通訊Flutter
- linux 程式間通訊之管道Linux
- Linux程式之間如何通訊?Linux
- Electron實戰之程式間通訊
- React之元件(component)之間的通訊React元件
- QT之不同主機之間TCP通訊QTTCP
- 【Flutter】開發之進階Widget(五)Flutter
- Flex4之與後臺伺服器通訊方式:WebServiceFlex伺服器Web
- 程式間的五種通訊方式介紹-詳解
- Tcp, WebSocket 和 http 之間的通訊TCPWebHTTP