ts事件
/**
* 单个事件类
*/
export class Event {
/** 回调函数 */
private callback: Function = null;
/** 节点 */
private context: any = null;
constructor(callback: Function, context: any) {
this.callback = callback;
this.context = context;
}
/**
* 调用
* @param args
*/
notify(...args: any[]): void {
this.callback.call(this.context, ...args);
}
/**
* 节点
* @param context
*/
compare(context: any): boolean {
return context == this.context;
}
}
/**
* 事件消息处理
*/
export class eventManager {
/** 监听数组 */
private static eventList = {};
/**
* 注册事件
* @param name 事件名称
* @param callback 回调函数
* @param context 上下文
*/
static on(name: string, callback: Function, context: any) {
let events: Event[] = this.eventList[name];
if (!events) {
this.eventList[name] = [];
}else{
console.log("重复注册,两个事件,会调用两次哦。")
}
this.eventList[name].push(new Event(callback, context));
}
/**
* 移除事件
* @param name 事件名称
* @param context 上下文
*/
static off(name: string, context: any) {
let events: Event[] = this.eventList[name];
if (!events) return;
let length = events.length;
for (let i = 0; i < length; i++) {
let event = events[i];
if (event.compare(context)) {
events.splice(i, 1);
break;
}
}
if (events.length == 0) {
delete this.eventList[name];
}
}
/**
* 发送事件
* @param name 事件名称
*/
static publish(name: string, ...args: any[]) {
let events: Event[] = this.eventList[name];
if (!events) {
console.log("还没有注册该事件:" + name)
return;
}
let length = events.length;
for (let i = 0; i < length; i++) {
let event = events[i];
event.notify(...args);
}
}
}

浙公网安备 33010602011771号