На моей работе мы использовали эту услугу ниже, чтобы подписаться и отправлять уведомления справа и четвертый. Как младший разработчик я уже разбираюсь в вводе и выводе Angular и о том, как работают эмиттеры.
Но этот сервис меня просто сбивает с толку. Разработчик, создавший эту услугу, уже покинул компанию, и, поскольку этот код является почти шаблоном для всех проектов, я не могу спросить его, как именно он работает.
конкретно эта строка: private stati c emitters : {[notificationName: string]: EventEmitter} = {}
import { Injectable } from '@angular/core';
import { EventEmitter } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class EventEmitterService {
private static emitters: { [notificationName: string]: EventEmitter<any> } = {}
static get(notificationName: string): EventEmitter<any> {
if (!this.emitters[notificationName])
this.emitters[notificationName] = new EventEmitter<any>();
return this.emitters[notificationName];
}
}
/**
to SUBSCRIBE:
private subscriptions = new Subscription();
constructor(){
this.subscriptions.add( EventEmitterService.get("notification_name").subscribe(payload => this.notificationHandler(payload)) );
}
TO EMIT:
EventEmitterService.get("notificationName").emit(payload);
to UNSUBSCRIBE:
ngOnDestroy(){
this.subscriptions.unsubscribe();
}
*/
Следуя инструкциям пользователя Michael D, я изменил код
import { Subject } from 'rxjs';
private emitters: { [notificationName: string]: Subject<any> } = { };
и получил эта ошибка:
Ошибка была вызвана тем, что возврат static get(notificationName: string):
не был изменен на Observable<any>
Итак, окончательная форма обслуживания, обновленная в соответствии с комментарием MichaelD:
import { Injectable } from '@angular/core';
import { EventEmitter } from '@angular/core';
import { Subject, Observable } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class EventEmitterService {
// private static emitters: { [notificationName: string]: EventEmitter<any> } = {}
private emitters: { [notificationName: string]: Subject<any> } = {};
get(notificationName: string): Observable<any>{
if (!this.emitters[notificationName])
this.emitters[notificationName] = new EventEmitter<any>();
return this.emitters[notificationName];
}
}