Sé cómo generar un evento con EventEmitter. También puedo adjuntar un método para ser llamado si tengo un componente como este:
<component-with-event (myevent)="mymethod($event)" />
Cuando tengo un componente como este, todo funciona muy bien. Moví algo de lógica a un servicio y necesito generar un evento desde dentro del Servicio. Lo que hice fue esto:
export class MyService {
myevent: EventEmitter = new EventEmitter();
someMethodThatWillRaiseEvent() {
this.myevent.next({data: 'fun'});
}
}
Tengo un componente que necesita actualizar algún valor basado en este evento, pero parece que no puedo hacerlo funcionar. Lo que intenté fue esto:
//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
}
}
¿Cómo hago para que MyComponent se suscriba al evento cuando el servicio que lo genera no es un componente?
Estoy en On 2.0.0-alpha.28
EDITAR: Modifiqué mi "ejemplo de trabajo" para que realmente funcione, por lo que el enfoque se puede poner en la parte que no funciona;)
Código de ejemplo: http://plnkr.co/edit/m1x62WoCHpKtx0uLNsIv
fuente
Respuestas:
Actualización : he encontrado una forma mejor / adecuada de resolver este problema utilizando un BehaviorSubject o un Observable en lugar de un EventEmitter. Consulte esta respuesta: https://stackoverflow.com/a/35568924/215945
Además, los documentos de Angular ahora tienen un ejemplo de libro de cocina que usa un Asunto .
Respuesta original / desactualizada / incorrecta: nuevamente, no use un EventEmitter en un servicio . Eso es un anti-patrón.
Usando beta.1 ... NavService contiene el EventEmiter. Component Navigation emite eventos a través del servicio y el componente ObservingComponent se suscribe a los eventos.
nav.service.ts
componentes.ts
Plunker
fuente
providers: [NavService]
? Si es así, obtendrá varias instancias del servicio.subscribe()
método. Al usar un método, podemos cambiar fácilmente EventEmitter a Subject u Observable, lo cual es mucho mejor, ya que ahora hemos aprendido que EventEmitters solo deben usarse para propiedades de salida. La forma correcta es usar un Subject, BehaviorSubject u Observable, y normalmente nos suscribimos directamente a estos, por lo que ya no necesitamos un método getNavChangeEmitter ().Usando alpha 28, logré suscribirme programáticamente a emisores de eventos a través del
eventEmitter.toRx().subscribe(..)
método. Como no es intuitivo, quizás cambie en una versión futura.fuente
click.toRx().subscribe(your_callback_function)