Flex Viewer 解析(五)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:当有新的数据被共享时,将新数据分发出去

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值