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监听、派发、捕捉事件外,没有发生任何直接的联系。
①??? ?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通过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:当有新的数据被共享时,将新数据分发出去 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |