EventEmitter в угловых сервисах, хорошо или плохо? - PullRequest
0 голосов
/ 01 июня 2018

Я использовал EventEmitter и @Output в сервисах Angular, сегодня один из коллег сказал, что это не очень хорошая практика.

Я нашел это сообщение , упомянув, что это плохая практикаи кажется, что в основном это личное мнение, и в этом ответе говорится, что его можно использовать.Я не смог найти никакого официального документа об этом, поэтому, если кто-то знает официальный ответ на него, пожалуйста, напишите.

Официальный документ о EventEmittter

1 Ответ

0 голосов
/ 01 июня 2018

Я использовал 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 , если они будут использоваться в шаблонах, но это не так.дело об услугах.

...