加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex Viewer 解析(五)Widget之间通信

发布时间:2020-12-15 01:31:43 所属栏目:百科 来源:网络整理
导读:虽然每个 Widget 都是封装良好的一个组件,提供一组针对特定业务功能的操作,但是有时候需要 Widget 之间的彼此协作来完成一个粒度更大的业务逻辑。此时就需要 Widget 之间的交互,或者说通信。经常看到这样的问题“一个 Widget 如何调用另外一个 Widget 的

虽然每个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:当有新的数据被共享时,将新数据分发出去

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读