Я использовал EventEmitter и @Output в сервисах Angular, сегодня один из коллег отметил, что это не очень хорошая практика.
Аннотация @Output()
не оказывает влияния на сервис.Он используется для указания компилятору шаблонов Angular связывать Observable
с выражением шаблона.
Если бы я увидел @Output()
в сервисе, то я бы сказал разработчику удалить его.
EventEmitter
- это Observable
, и при использовании его в сервисе нет побочных эффектов, но также нет никаких преимуществ.
Вы можете использовать эмиттер любого типа Observable
в компоненте или услуге.Есть две причины, по которым мы имеем EventEmitter
.1) он предшествует решению команд Angular принять обязательство использовать наблюдаемые, и они думают, что им может потребоваться их собственная реализация, 2) он может выдавать значения в следующем цикле JavaScript (необязательный параметр).
Были крайниеслучаи, когда людям требовалось выдавать изменения в следующем цикле, чтобы избежать проблем с обнаружением изменений.
Защита ваших наблюдаемых
@Injectable()
export class MyService {
public events: Subject<any> = new Subject();
}
Проблема с вышеуказанным сервисом состоит в том, что любой может испускать значения изобщедоступный events
.Вы хотите, чтобы ваша служба была единственным кодом, который обрабатывает передаваемые значения.
@Injectable()
export class MyService {
private _events: Subject<any> = new Subject();
public get events(): Observable<any> {
return this._event;
}
}
Выше описанное лучше, потому что доступ к Subject.next(..)
является частным.Потребители могут подписаться только на наблюдаемое.
Если вы следовали подходу component .Это заставляет вас выставлять ваш эмиттер, что не очень хорошая идея.
@Injectable()
export class MyService {
@Output() // <<< has no effect
public events: EventEmitter<any> = new EventEmitter();
// ^^ makes the emitter public
}
Компоненты должны иметь свои свойства как public , если они будут использоваться в шаблонах, но это не так.дело об услугах.