angular中全局订阅事件,包含取消订阅,非常好用
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class GlobalEvent {
/**存储事件上一次的value */
private _datas = {};
private _data$ = new Subject();
private _dataFlow$ = this._data$.asObservable();
private _subscriptions: Map = new Map();
constructor() {
this._dataFlow$.subscribe((data: EventInfo) => this._onEvent(data));
}/**
* 通知构造函数中的订阅触发事件
* @param 事件名
* @param 数据
*/
notifyDataChanged(event: GlEvenName, value: T) {
let current = this._datas[event];
if (current !== value) {
this._datas[event] = value;
this._data$.next({
event: event,
data: value
});
}
}/**
* 订阅事件
* @param 事件名
* @param 回调函数id用于移除监听 推荐使用
* @param 回调函数
*/
subscribe(event: GlEvenName, id: string = 'global', callback: Function) {
let subscriber = this._subscriptions.get(event) || Object.create(null);
let cbs = subscriber[id] = subscriber[id] || [];
cbs.push(callback);
this._subscriptions.set(event, subscriber);
}/**
* 移除订阅事件
* @param 事件名
* @param 回调函数id用于移除
*/
unsubscribe(event: GlEvenName, id: string = 'global') {
let subscriber = this._subscriptions.get(event) || Object.create(null);
delete subscriber[id]
}/**触发事件回调函数 */
private _onEvent(evenInfo: EventInfo) {
let subscriber = this._subscriptions.get(evenInfo.event) || Object.create(null);
let data = https://www.it610.com/article/evenInfo.data;
for (const key in subscriber) {
let cbs = subscriber[key] || [];
cbs.forEach(cb => {
cb.call(null, data)
})
}
}
}type GlEvenName = keyof typeof ONNAME;
/**事件名 和数据 */
interface EventInfo { event: GlEvenName, data: any };
/**全局gl事件名称集合,键值必须一样 必须在此处调用并写入GlEvenName */
export const ONNAME = {
CHNGE: 'CHNGE',
GOOD: 'GOOD',
}
使用方法就是在需要用到的组件中的构造函数中引入
import { GlobalEvent } from 'src/app/globalnew.state';
constructor(
private gl$:GlobalEvent
){}
------
this.gl$.notifyDataChanged('CHNGE','123456')
【angular中全局订阅事件,包含取消订阅,非常好用】在需要订阅的组件中
import { GlobalEvent } from 'src/app/globalnew.state';
constructor(
private gl$:GlobalEvent
){}
------
this.gl$.subscribe('CHNGE','CHNGE',((item:any)=>{
console.log(item) //打印出'123456'
}))this.gl$.unsubscribe('CHNGE','CHNGE');
//取消订阅
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理