一,介绍
EventHub 类似Android中的EventBus ,可用于事件传递,提供了订阅,取消订阅,触发事件的能力。但是EventHub不是全局的事件中心,事件的订阅,取消和触发都作用在某一个具体的EventHub对象上。因此不同的EventHub对象之间无法传递事件,也不可用于跨进程通信。
二,使用
1,获取EventHub对象
EventHub对象存在于UIAbilityContext 中,所以在UIAbility中可以通过this.context获取:
this.context.eventHub
在页面或是组件中可以通过 getContext() as common.UIAbilityContext 获取:
let context: common.UIAbilityContext = (getContext() as common.UIAbilityContext)
let eventHub: common.EventHub = context.eventHub
2,订阅事件
this.context.eventHub.on('event', (data: string) => {
console.error('event: ' + data)
})
//系统源码
on(event: string, callback: Function): void;
参数:
event:对应事件key值,表示只接受这一key值事件;
callback:事件回调,可接收传递的参数,参数可以有多个。
这里要注意this指向的问题,eg:
private value: string = '123'
private onEvent() {
console.error('event value = ' + this.value)
}
this.context.eventHub.on('event', this.onEvent)
callback被emit触发时,调用方是EventHub对象。所以在回调函数onEvent()中 this.value中的this指的是EventHub对象,而在EventHub对象中没有value值,所以打印出的值是undefind。可以通过使用=>函数解决:
this.context.eventHub.on('event', () => {
console.error(TAG, 'value = ' + this.value)
})
或者在=>函数中调用onEvent()。
3,发送事件
this.context.eventHub.emit('event', 'event data')
可同时传递多个参数:
emit(event: string, ...args: Object[]): void;
4,取消订阅
在页面的aboutToDisappear()中取消订阅:
callback: Function = () => {
console.error('value = ' + this.value)
}
aboutToDisappear(): void {
this.context.eventHub.off('event', this.callback)
}
系统源码:
off(event: string, callback?: Function): void;
参数:
event:需要取消订阅的事件 key;
callback:取消指定事件的订阅 ,不传时取消事件key下所有的事件订阅。
三,注意事项
- 不同context对象下的EvengHub对象不能进行事件传递,不能用于进程间的事件传递;
- 订阅事件中的this指向问题;
- 取消订阅时callback不传时会取消事件key下所有的事件订阅;
- 不具有生命周期感知能力,要手动调用off取消订阅。
如果需要感知生命周期,跨进程通信可以参考LiveEventBus


2273

被折叠的 条评论
为什么被折叠?



