ejemplo change javascript angular

javascript - change - observable angular 6 ejemplo



¿Cómo suscribirse a un evento en un servicio en Angular2? (2)

Sé cómo generar un evento con EventEmitter. También puedo adjuntar un método para que se llame 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 probé 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 2.0.0-alpha.28

EDITAR: Modifiqué mi "ejemplo de trabajo" para que realmente funcione, por lo que se puede enfocar en la parte que no funciona;)

Código de ejemplo: http://plnkr.co/edit/m1x62WoCHpKtx0uLNsIv


Usando alpha 28, logré suscribirme mediante programación a los emisores de eventos mediante el método eventEmitter.toRx().subscribe(..) . Como no es intuitivo, tal vez pueda cambiar en una versión futura.


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://.com/a/35568924/215945

Además, los documentos angulares 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 antipatrón.

Usando beta.1 ... NavService contiene EventEmiter. Component Navigation emite eventos a través del servicio, y el componente ObservingComponent se suscribe a los eventos.

nav.service.ts

import {EventEmitter} from ''angular2/core''; export class NavService { navchange: EventEmitter<number> = new EventEmitter(); constructor() {} emitNavChangeEvent(number) { this.navchange.emit(number); } getNavChangeEmitter() { return this.navchange; } }

componentes.ts

import {Component} from ''angular2/core''; import {NavService} from ''../services/NavService''; @Component({ selector: ''obs-comp'', template: `obs component, item: {{item}}` }) export class ObservingComponent { item: number = 0; subscription: any; constructor(private navService:NavService) {} ngOnInit() { this.subscription = this.navService.getNavChangeEmitter() .subscribe(item => this.selectedNavItem(item)); } selectedNavItem(item: number) { this.item = item; } ngOnDestroy() { this.subscription.unsubscribe(); } } @Component({ selector: ''my-nav'', template:` <div class="nav-item" (click)="selectedNavItem(1)">nav 1 (click me)</div> <div class="nav-item" (click)="selectedNavItem(2)">nav 2 (click me)</div> `, }) export class Navigation { item = 1; constructor(private navService:NavService) {} selectedNavItem(item: number) { console.log(''selected nav item '' + item); this.navService.emitNavChangeEvent(item); } }

Plunker