TL; DR :
Ні, не підписуйтесь на них вручну, не використовуйте їх у сервісах. Використовуйте їх, як показано в документації, лише для передачі подій в компонентах. Не перемагайте абстракцію кута.
Відповідь:
Ні, ви не повинні підписатися на нього вручну.
EventEmitter - це кутова абстракція2, і єдина його мета - випромінювати події в компонентах. Цитуючи коментар Роб Вормальд
[...] EventEmitter - це дійсно кутова абстракція, і його слід використовувати в значній мірі лише для передачі користувацьких подій у компонентах. В іншому випадку просто використовуйте Rx так, ніби це була будь-яка інша бібліотека.
Це сказано дійсно ясно в документації EventEmitter.
Використовуйте директивами та компонентами для передачі користувацьких подій.
Що не так у використанні?
Angular2 ніколи не гарантує нам, що EventEmitter продовжить бути спостережуваним. Отже, це означає рефакторинг нашого коду, якщо він зміниться. Єдиний API, до якого ми маємо отримати доступ, це йогоemit()
метод. Ми ніколи не повинні підписуватись на EventEmitter вручну.
Все сказане вище зрозуміло в коментарі Уорда Белла (рекомендується прочитати статтю та відповідь на цей коментар). Цитуючи довідку
НЕ розраховуйте на те, що EventEmitter продовжує бути спостерігачем!
НЕ розраховуйте на те, що ті оператори, які спостерігаються, будуть там у майбутньому!
Вони будуть застарілі найближчим часом і, ймовірно, будуть видалені перед випуском.
Використовуйте EventEmitter лише для прив'язки подій між дочірнім та батьківським компонентом. Не підписуйтесь на це. Не вимагайте жодного з цих методів. Тільки дзвонітьeve.emit()
Його коментар узгоджується з коментарем Роба давно.
Отже, як правильно ним користуватися?
Просто використовуйте його для передачі подій зі свого компонента. Погляньте на наступний приклад.
@Component({
selector : 'child',
template : `
<button (click)="sendNotification()">Notify my parent!</button>
`
})
class Child {
@Output() notifyParent: EventEmitter<any> = new EventEmitter();
sendNotification() {
this.notifyParent.emit('Some value to send to the parent');
}
}
@Component({
selector : 'parent',
template : `
<child (notifyParent)="getNotification($event)"></child>
`
})
class Parent {
getNotification(evt) {
// Do something with the notification (evt) sent by the child!
}
}
Як не користуватися ним?
class MyService {
@Output() myServiceEvent : EventEmitter<any> = new EventEmitter();
}
Зупиніться прямо тут ... ви вже помиляєтесь ...
Сподіваємось, що ці два простих приклади пояснять правильне використання EventEmitter.