角度2:事件广播服务

Tom*_*rik 4 typescript angular

我正在尝试创建事件广播服务。

这是我想要实现的基本概念:

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
                } 
             }
        );
   }
}
Run Code Online (Sandbox Code Playgroud)

我知道我不能从这样的服务中调用组件的方法。我必须以某种方式返回observable,并从组件中调用它。我不确定如何实现这一目标。

感谢您的任何建议。


感谢AngularFrance,这是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);
  }

}
Run Code Online (Sandbox Code Playgroud)

Ang*_*hef 5

您应该从BroadcastService(NB。A SubjectObservable)返回可观察值:

@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);
     }
}
Run Code Online (Sandbox Code Playgroud)

然后订阅从组件返回的observable:

export class MyComponent {

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

  someMethod() { }

}
Run Code Online (Sandbox Code Playgroud)

注意:如果只想在流中使用特定类型的事件,则与返回流时相比,将它们添加到流中(在方法中)之前过滤掉不需要的事件可能是最佳选择next()