Angular 2:BehaviorSubject,避免多次订阅

时间:2017-03-22 12:16:20

标签: angular typescript

您好我的Angular 2应用程序中存在以下问题。

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

我在这样的组件中使用它:

export class MyComponent implements OnInit {

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

每当我路由到'/ mycomponent'时,都会调用MyComponent.constructor,因此会多次订阅Event.BLA_EVENT。

有关如何防止多次订阅的任何建议吗?

2 个答案:

答案 0 :(得分:6)

组件内的手动订阅应始终在ngOnDestroy挂钩中取消订阅。这是为了防止内存泄漏,不必要的双重订阅以及在组件被销毁后更改组件内部的错误时发生的错误:

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

}

答案 1 :(得分:0)

我有类似的问题,我通过检查事件中观察者的数量来解决它。 使用class C extends A{ public void n1(){ //do stuff } public void n2(){ //do stuff } //+30 more abstract methods implemented //But here i want all the non abstract methods and only 10 abstract methods of B } 的选项可能是最好的,但另一种方法可能是:

ngOnDestroy