服务订阅在ngOnInit [Angular 2]内启动多次

时间:2016-12-29 10:53:21

标签: angular rxjs

我有问题,当我去不同的页面并将银行返回到第一页这个组件时:

ngOnInit() {
  this.getModal();
}

getModal() {

this.subscription = this.sharedService.itemEdit$.subscribe((bank: any) => {
            console.log("TEST")
            this.subscription.unsubscribe();
        });
}

即使我只调用一次发射服务,我也会得到多个子信息。

任何人都知道什么可能是个问题?

2 个答案:

答案 0 :(得分:3)

你需要在Angular破坏指令/ component之前取消订阅ngOnDestroy内部。检查Angular Lifecycle hook

ngOnDestroy() {
  if(this.subscription) {
    this.subscription.unsubscribe();
  }
}

答案 1 :(得分:0)

ranakrunal9's answer的替代方案,如果您有多个订阅可能会有所帮助,就是设置销毁的$ -trigger并使用.takeUntil(this.destroyed$)

class SomeComponent {
    destroyed$ = new Subject();

    ngOnInit() {
        this.sharedService.itemEdit$
            .takeUntil(this.destroyed$) // this will automatically complete the stream when destroyed and therefor close the subscription
            .subscribe(...);

        this.sharedService.otherStream$
            .takeUntil(this.destroyed$)
            .subscribe(...);

        this.sharedService.streamThree$
            .takeUntil(this.destroyed$)
            .subscribe(...);
    }

    ngOnDestroy() {
        this.destroyed$.next();
    }
}

作为补充说明:尝试在组件中避免手动订阅,通常会有一个组件显示数据,可以使用async-pipe来处理{自动{1}}和subscribe,因此您不必担心这一切。

如果正在进行永久性事务(如后台任务),请使用服务。