TL; DR :
Нет, не подписывайтесь на них вручную, не используйте их в сервисах. Используйте их, как показано в документации, только для генерации событий в компонентах. Не побеждайте угловую абстракцию.
Ответ:
Нет, вы не должны подписываться на него вручную.
EventEmitter является абстракцией angular2, и его единственная цель - генерировать события в компонентах. Цитирую комментарий от Роба Вормальда
[...] EventEmitter - это действительно угловая абстракция, и его следует использовать в основном только для создания пользовательских событий в компонентах. В противном случае просто используйте Rx, как если бы это была любая другая библиотека.
Это действительно ясно указано в документации к EventEmitter.
Используйте директивы и компоненты для создания пользовательских событий.
Что плохого в его использовании?
Angular2 никогда не гарантирует нам, что EventEmitter останется наблюдаемым. Так что это означает рефакторинг нашего кода, если он меняется. Единственный API, к которому мы должны получить доступ - это его emit()
метод. Мы никогда не должны подписываться вручную на EventEmitter.
Все вышеизложенное более четко видно в комментарии этого Уорд Белла (рекомендуется прочитать статью и ответ на этот комментарий). Цитирование для справки
НЕ рассчитывайте на то, что EventEmitter останется наблюдаемым!
НЕ рассчитывайте на тех операторов Observable, которые будут там в будущем!
Они скоро будут устаревшими и, вероятно, будут удалены перед выпуском.
Используйте 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.