17.-Event-Aggregator

Since Narik is a module framework, you sometimes need to handle events from one module in another module. Narik Event Aggregator Service helps you to do that easily.

 /**
 * Event aggregator service
 * A service that manage events inside application.
 */
 export abstract class EventAggregatorService {

  /**
   * Publish event aggregator service
   * @param eventType eventType
   * @param eventArgs  event argument
   */
  abstract publish(eventType: any, eventArgs: any);

  /**
   * Listens event aggregator service
   * @param eventType  eventType
   * @returns  an `Observable` that emit whenever event occurs.
   */
  abstract  listen<T>(eventType: any): Observable<T>;
}

It has two methods. One for listen and another for publishing. For example, you may listen for "MODULE_LOAD_COMPLETELY" event to do something when one module loads completely.

example:

export class ModuleLoadCompletelyGuard implements CanActivate {
  constructor(
     private eventAggregatorService: EventAggregatorService
  ) {}

  canActivate(route: ActivatedRouteSnapshot) {
    const moduleKey = route.data["moduleKey"];
    return Observable.create((observer: Observer<any>) => {
      this.eventAggregatorService
        .listen<{ moduleKey: string }>("MODULE_LOAD_COMPLETELY")
        .pipe(
          filter(x => x.moduleKey === moduleKey),
          first()
        )
        .subscribe(() => {
          observer.next(true);
        });
    });
  }
}

Each event can be published by its owner. For example "MODULE_LOAD_COMPLETELY" is published by ModuleManager.

export class test
{
    someMethod()
    {
        this.eventAggregatorService.publish("MODULE_LOAD_COMPLETELY", {
            moduleKey: key,
            moduleInfo: moduleInfo
        });
    }
}

Narik Event Aggregator Service use one subject for each event type. If you specify event's attributes in metadata, Event Aggregator Service uses them, otherwise uses simple subject.

Events Metadata

Last updated