2017-02-16 59 views
4

我正在嘗試創建事件廣播服務。Angular 2:事件廣播服務

這是基本概念,我想實現什麼:

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 
       } 
      } 
     ); 
    } 
} 

我知道我不能從服務調用組件的方法是這樣的。我必須以某種方式返回觀察值,並從組件中調用它。我不知道如何實現這一點。

感謝您的任何建議。


SOLUTION

感謝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); 
    } 

} 
+0

typescript不支持回調函數,你不能這樣做 – Aravind

回答

4

你應該從BroadcastService返回觀察到的(NB。一個SubjectObservable):

export class MyComponent { 

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

    someMethod() { } 

} 

注:

@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); 
    } 
} 

然後從組件訂閱返回觀察到如果您只想特定類型的數據流中的事件,它可能是更好地過濾不想要的事件之前將它們添加到流(在next()方法),而不是返回流時。

+0

謝謝,爲答案。 但我想實現的是, /*測試eventValue * /將在BroadcastService中,否則沒有包裝Subject到BroadcastService的點。 –

+0

你是說你只想打電話給你的方法來處理某些事件? – AngularChef

+0

是的,我想訂閱一個事件:訂閱(事件:事件,...)。 –