2017-03-22 10 views
0

こんにちは私は角2アプリで次の問題があります。角2:BehaviorSubject、複数のサブスクリプションで避ける

は私がBroadcastServiceを持っている:

私はMyComponent.constructor '/ MyComponentの' へのルートが呼ばれるたび
export class MyComponent implements OnInit { 

    constructor(public broadcastService: BroadcastService) { 
    this.broadcastService.subject(Event.BLA_EVENT).subscribe(() => this.bla()); 
    } 
... 

ので:私はこのようなコンポーネントで使用

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

Event.BLA_EVENTは複数回サブストライピングされています。

複数のタイムサブスクリプションを防止する方法についてアドバイスしますか?

+1

'' ngOnDestroy'のライフサイクル上のそれからunsubscribe'? – echonax

答えて

3

コンポーネント内の手動サブスクリプションは、ngOnDestroyフックで常にサブスクライブ解除する必要があります。これは、メモリリークを防ぐために、不要な二重のサブスクリプションで、あなたはそれが破壊された後、コンポーネント内の何かを変更した場合、エラーがoccuring:

export class MyComponent implements OnInit, OnDestroy { 

    private _broadSub; 

    constructor(public broadcastService: BroadcastService) {} 

    ngOnInit() { 
     this._broadSub = this.broadcastService.subject(Event.BLA_EVENT).subscribe(() => this.bla()); 
    } 

    ngOnDestroy() { 
     this._broadSub.unsubscribe(); 
    } 

} 
0

私は同様の問題があったと私はオブザーバーの量をチェックして、それを解決しましたイベントで。 ngOnDestroyを使用して オプションが最適かもしれませんが、他のアプローチのようなものが考えられます。

constructor(public broadcastService: BroadcastService) { 
    if(this.broadcastService.subject(Event.BLA_EVENT).observers.length == 0) { 
     this.broadcastService.subject(Event.BLA_EVENT).subscribe(() => this.bla()); 
    } 
} 
関連する問題