ag-grid
Version:
Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components
89 lines (70 loc) • 3.03 kB
text/typescript
import {IEventEmitter} from "../interfaces/iEventEmitter";
import {EventService} from "../eventService";
import {GridOptionsWrapper} from "../gridOptionsWrapper";
import {_} from "../utils";
import {AgEvent} from "../events";
export class BeanStub implements IEventEmitter {
public static EVENT_DESTROYED = 'destroyed';
private localEventService: EventService;
private destroyFunctions: (()=>void)[] = [];
private destroyed = false;
public destroy(): void {
this.destroyFunctions.forEach( func => func() );
this.destroyFunctions.length = 0;
this.destroyed = true;
this.dispatchEvent({type: BeanStub.EVENT_DESTROYED});
}
public addEventListener(eventType: string, listener: Function): void {
if (!this.localEventService) {
this.localEventService = new EventService();
}
this.localEventService.addEventListener(eventType, listener);
}
public removeEventListener(eventType: string, listener: Function): void {
if (this.localEventService) {
this.localEventService.removeEventListener(eventType, listener);
}
}
public dispatchEventAsync(event: AgEvent): void {
setTimeout( ()=> this.dispatchEvent(event), 0);
}
public dispatchEvent<T extends AgEvent>(event: T): void {
if (this.localEventService) {
this.localEventService.dispatchEvent(event);
}
}
public addDestroyableEventListener(eElement: Window|HTMLElement|IEventEmitter|GridOptionsWrapper, event: string, listener: (event?: any)=>void): void {
if (this.destroyed) { return; }
if (eElement instanceof HTMLElement) {
_.addSafePassiveEventListener((<HTMLElement>eElement), event, listener);
} else if (eElement instanceof Window) {
(<Window>eElement).addEventListener(event, listener);
} else if (eElement instanceof GridOptionsWrapper) {
(<GridOptionsWrapper>eElement).addEventListener(event, listener);
} else {
(<IEventEmitter>eElement).addEventListener(event, listener);
}
this.destroyFunctions.push( ()=> {
if (eElement instanceof HTMLElement) {
(<HTMLElement>eElement).removeEventListener(event, listener);
} else if (eElement instanceof Window) {
(<Window>eElement).removeEventListener(event, listener);
} else if (eElement instanceof GridOptionsWrapper) {
(<GridOptionsWrapper>eElement).removeEventListener(event, listener);
} else {
(<IEventEmitter>eElement).removeEventListener(event, listener);
}
});
}
public isAlive(): boolean {
return !this.destroyed;
}
public addDestroyFunc(func: ()=>void ): void {
// if we are already destroyed, we execute the func now
if (this.isAlive()) {
this.destroyFunctions.push(func);
} else {
func();
}
}
}