CocosCreator 事件的监听,派发 与销毁
创建一个对象类,用来管理对应的监听
class EventAgs{ //监听对象
name:string =null; //事件名
cb:Function = null; //回调
obj:any = null; //对象
}
创建一个字典用来缓存监听的事件集合
private eventDic:Map<string,Array> = null;
监听事件-》 添加监听
###添加事件
public on(eventName:string, func:Function, obj:any){
let itemArr = this.eventDic.get(eventName);
if(!itemArr){
itemArr = new Array();
}else{
for (let i = 0; i < itemArr.length; i++) {
const item = itemArr[i];
if(item.cb === func && item.obj === obj){
return;
}
}
}
const data = new EventAgs();
data.name = eventName;
data.cb = func;
data.obj = obj;
itemArr.push(data);
this.eventDic.set(eventName, itemArr);
}
###移除事件
//移除事件
public off(eventName:string, func:Function, obj:any){
let itemArr = this.eventDic.get(eventName);
if(itemArr){
for (let i = itemArr.length - 1; i >= 0; i–) {
const item = itemArr[i];
if(item.cb === func && item.obj === obj){
itemArr.splice(i,1);
break;
}
}
}
}
###派发
//触发事件-派发
public dispatcher(eventName:string, argArr?:any){
let itemArr = this.eventDic.get(eventName);
if(itemArr){
for (let i = 0; i < itemArr.length; i++) {
const item = itemArr[i];
if(item.cb && item.obj){
item.cb.apply(item.obj, argArr);
}
}
}
}
完成代码==============》
class EventAgs{ //监听对象
name:string =null; //事件名
cb:Function = null; //回调
obj:any = null; //对象
}
///事件管理器=》 单利
export class EventManager{
private static _instance:EventManager = null;
private eventDic:Map<string,Array<EventAgs>> = null;
constructor(){
this.eventDic = new Map<string,Array<EventAgs>>();
}
public static getInstane(){
if(this._instance == null){
this._instance = new EventManager();
}
return this._instance;
}
//添加事件
public on(eventName:string, func:Function, obj:any){
let itemArr = this.eventDic.get(eventName);
if(!itemArr){
itemArr = new Array<EventAgs>();
}else{
for (let i = 0; i < itemArr.length; i++) {
const item = itemArr[i];
if(item.cb === func && item.obj === obj){
return;
}
}
}
const data = new EventAgs();
data.name = eventName;
data.cb = func;
data.obj = obj;
itemArr.push(data);
this.eventDic.set(eventName, itemArr);
}
//移除事件
public off(eventName:string, func:Function, obj:any){
let itemArr = this.eventDic.get(eventName);
if(itemArr){
for (let i = itemArr.length - 1; i >= 0; i--) {
const item = itemArr[i];
if(item.cb === func && item.obj === obj){
itemArr.splice(i,1);
break;
}
}
}
}
//触发事件-派发
public dispatcher(eventName:string, argArr?:any){
let itemArr = this.eventDic.get(eventName);
if(itemArr){
for (let i = 0; i < itemArr.length; i++) {
const item = itemArr[i];
if(item.cb && item.obj){
item.cb.apply(item.obj, argArr);
}
}
}
}
}