Flex Viewer 解析(五)Widget之間通訊

gispace發表於2011-05-12

雖然每個Widget都是封裝良好的一個元件,提供一組針對特定業務功能的操作,但是有時候需要Widget之間的彼此協作來完成一個粒度更大的業務邏輯。此時就需要Widget之間的互動,或者說通訊。經常看到這樣的問題“一個Widget如何呼叫另外一個Widget的方法?”。Widget之間彼此相互獨立,互不知曉,“一個Widget呼叫另一個Widget的方法”意味著兩個Widget緊密地耦合在了一起,這不符合“鬆耦合”的要求。那麼Widget之間該如何互動呢?答案還是事件!還記得ViewerContaineraddEventListener()dispatchEvent()方法麼?ViewerContainer通過EventBus新增監聽和派發事件,使各模組默契協作。

5.1  直接通訊

直接通訊是指Widget A監聽某一事件EWidget B在任何時間派發了事件EWidget A都能夠捕捉到這個事件,並進行響應。當然,這裡對事件的監聽和捕捉都是通過ViewerContainer代理的EventBus實現的,參見圖5.1。我們注意到,Widget AWidget 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 AWidget B,以及兩者與DataManager之間並未直接互動,所有的協作都通過事件來完成。

 

     DataManager通過EventBus監聽共享資料事件獲取資料事件

     Widget B派發共享資料事件

     DataManager響應共享資料事件,將資料以key-value的形式儲存;

     Widget A監聽分發資料事件,並且派發獲取資料事件

     DataManager響應獲取資料事件,查詢Widget A所需資料,派發分發資料事件

     Widget A響應分發資料事件,並做相應的響應動作。

DataManagerFlex Viewer為模組之間共享資料和儲存共享資料設計的一種解決方案。DataManager將各個模組需要共享出來的資料儲存在記憶體中,一旦某個模組需要獲取共享資料,派發一個訊息即可,DataManager會響應這個訊息,並共享資料作為訊息的載體派發出去。

DataManager響應的事件

u  DATA_FETCH_ALL:獲取資料事件(全部資料)

u  DATA_PUBLISH:共享資料事件

u  DATA_FETCH:獲取資料事件(根據key獲取資料)

DataManager派發的事件

u  DATA_SENT:分發資料事件

u  DATA_NEW_PUBLISHED:當有新的資料被共享時,將新資料分發出去

 

相關文章