Я знаю, как вызвать событие с помощью EventEmitter. Я также могу прикрепить метод, который будет вызываться, если у меня есть такой компонент:
<component-with-event (myevent)="mymethod($event)" />
Когда у меня есть такой компонент, все отлично работает. Я перенес некоторую логику в службу, и мне нужно вызвать событие внутри службы. Я сделал вот что:
export class MyService {
myevent: EventEmitter = new EventEmitter();
someMethodThatWillRaiseEvent() {
this.myevent.next({data: 'fun'});
}
}
У меня есть компонент, которому необходимо обновить какое-то значение на основе этого события, но я не могу заставить его работать. Я пробовал вот что:
//Annotations...
export class MyComponent {
constructor(myService: MyService) {
//myService is injected properly and i already use methods/shared data on this.
myService.myevent.on(... // 'on' is not a method <-- not working
myService.myevent.subscribe(.. // subscribe is not a method <-- not working
}
}
Как заставить MyComponent подписаться на событие, когда вызывающая его служба не является компонентом?
Я использую 2.0.0-alpha.28
РЕДАКТИРОВАТЬ: изменен мой «рабочий пример», чтобы он действительно работал, поэтому можно сосредоточить внимание на неработающей части;)
Пример кода: http://plnkr.co/edit/m1x62WoCHpKtx0uLNsIv
источник
Ответы:
Обновление : я нашел лучший / правильный способ решить эту проблему, используя BehaviorSubject или Observable, а не EventEmitter. См. Этот ответ: https://stackoverflow.com/a/35568924/215945
Кроме того, в документации Angular теперь есть пример поваренной книги, в которой используется тема .
Оригинальный / устаревший / неправильный ответ: опять же, не используйте EventEmitter в сервисе . Это антипаттерн.
Используя beta.1 ... NavService содержит EventEmiter. Component Navigation испускает события через службу, а компонент ObservingComponent подписывается на события.
nav.service.ts
components.ts
Plunker
источник
providers: [NavService]
? Если это так, вы получите несколько экземпляров службы.subscribe()
метод. Используя метод, мы можем легко изменить EventEmitter на Subject или Observable, что намного лучше, поскольку теперь мы узнали, что EventEmitter следует использовать только для свойств вывода. Правильный способ - использовать Subject, BehaviorSubject или Observable, и мы обычно подписываемся на них напрямую, поэтому нам больше не нужен метод getNavChangeEmitter ().Используя alpha 28, я выполнил программную подписку на эмиттеры событий посредством
eventEmitter.toRx().subscribe(..)
метода. Поскольку это не интуитивно понятно, возможно, оно изменится в будущем выпуске.источник
click.toRx().subscribe(your_callback_function)