每次初始化组件时,从行为主题接收多个数据实例

时间:2016-05-25 06:54:42

标签: angular rxjs

我有一个简单的路由器,我正在调用服务并从行为主题接收数据...当我导航到另一条路线并回来时,我从主题接收多个值...我怎么能摧毁所有一个主题的观察者,并在我需要的时候创造新的主题......?以下是plunker演示http://plnkr.co/edit/OKiljCekSKHO1zJF5MAy?p=preview
我打算在ngOnDestroy中销毁一个主题的观察者...

  ngOnDestroy(){
this.srvc.DestroySubject();
 }

有人可以告诉我如何销毁行为主体的观察者吗?

1 个答案:

答案 0 :(得分:3)

预期会有这种行为。

export class Sample1 {
  constructor(public srvc:HeroService) {
      this.srvc.Data.subscribe(data=> {
        console.log(data);
      });
      this.srvc.GetData();
  }
}

在构造函数中,您订阅了srvc.Data,因为DataBehaviorSubject,它会返回最近发布的值。您使用Data初始化null,因此最初没有数据。

然后在构造函数中调用this.srvc.GetData()这会导致事件被发出并被订阅(前面的行)接收。

如果您离开并返回,则再次初始化Sample1并执行构造函数。首先是订阅srvc.Data。并且它从前一次调用Received Data(当我们第一次导航到英雄时)获得最后一个发射值GetData()

接下来是对this.srvc.GetData()的调用再次发出Received Data,订阅会传递此值。

解决方法

要解决此问题,您可以将呼叫转移到this.srvc.GetData();,而不是像

那样
@Injectable()
export class HeroService {
  Data: BehaviorSubject<RepairOrder> = new BehaviorSubject(null);

  constructor() {
    this.GetData();
  }

  GetData(){
    this.Data.next('Recieved Data');
  }
  DestroySubject(){
    //alert('hi');
  }
}

Plunker example