Próbuję stworzyć usługę transmisji imprez.

Oto podstawowa koncepcja, co chciałbym osiągnąć:

export enum Event {
   EVENT_A,
   EVENT_B, ...
}


@Injectable()
export class BroadcastService {

     private broadcastSubject: Subject<Event> = new Subject<Event>();

     public next(event: Event): void {
         return this.broadcastSubject.next(event);
     }

     public subscribe(event: Event, componentCall: Function): void {
         this.broadcastSubject.subscribe(
             eventValue => {
                if(event === eventValue) {
                  componentCall(); // not possible to call component's method like this
                } 
             }
        );
   }
}

Wiem, że nie mogę nazwać metody komponentu z takiej usługi. Muszę w jakiś sposób zwrócić obserwowalny i nazwać go z komponentu. Nie jestem pewien, jak to osiągnąć.

Dzięki za każdą radę.


ROZWIĄZANIE

Dzięki angulatorFrance, oto rozwiązanie dla broadcastservice:

@Injectable()
export class BroadcastService {

  private broadcastSubject: BehaviorSubject<Event> = new BehaviorSubject<Event>(0);

  public next(event: Event): void {
     return this.broadcastSubject.next(event);
  }

  public subject(event: Event): Observable<Event> {
     return this.broadcastSubject.asObservable().filter(e => e === event);
  }

}
4
Tomas Marik 16 luty 2017, 14:13

2 odpowiedzi

Najlepsza odpowiedź

Powinieneś zwrócić obserwowalny od BroadcastService (NB. A Subject jest Observable):

@Injectable()
export class BroadcastService {

     private event: Subject<Event> = new Subject<Event>();

     public next(event: Event): void {
       return this.event.next(event);
     }

     public getEvents(event: Event): Observable<Event> {
       // DO NOT SUBSCRIBE HERE. Return the observable.
       return this.event.asObservable()
         // Only keep events matching the given `event` param
         .filter(e => e == event);
     }
}

Następnie subskrybuj zwracane obserwowalne z komponentu:

export class MyComponent {

  constructor(bcservice: BroadcastService) {
    // Subscribe here.
    bcservice.getEvents(event).subscribe(eventValue => {
      this.someMethod();
    });
  }

  someMethod() { }

}

Uwaga: Jeśli kiedykolwiek chcesz mieć określony typ zdarzeń w strumieniu, może być bardziej optymalny do filtrowania niechcianych zdarzeń przed dodając je do strumienia (w metodzie next()) w przeciwieństwie do powrotu strumienia.

5
AngularChef 16 luty 2017, 11:38