4

I have created a service that has a stream$ that will emit an event, I hope after the app.component fires the stream$ emit, the child component in the <router-outlet></router-outlet> will be able to subscribe it, but now the problem I have is even if it subscribes it in the constructor, the subscription call back never gets fired.

I wonder if this is different from when emitting events through a stream service?

What is the best practice?

Downhillski
  • 2,555
  • 2
  • 27
  • 39
  • Here is my implementation of such a service that allows to get the nth last values upon subscription. https://stackoverflow.com/questions/46027693/angular2-4-broadcast-service-using-rxjs – Codewarrior Sep 03 '17 at 20:55

1 Answers1

8

The most simple way is to create event bus service:

export class EventBusService
{
    bus:Subject<Event> = new Subject<Event>();

    dispatch(data:Event){
        this.bus.next(data);
    }

    //its up to you how to implement it:
    listen(type:string):Observable<Event> {
        return this.bus.filter(event=>event.type === type);
    }
}

Use dependency injection:

bootstrap(App, [EventBusService]);

Component constructor:

constructor(bus:EventBusService){
   bus.dispatch(new Event());
   bus.listen('load').subscribe((e)=>{console.log('loaded');})
}
kemsky
  • 14,727
  • 3
  • 32
  • 51