我有一个简单的路由器,我正在调用服务并从行为主题接收数据...当我导航到另一条路线并回来时,我从主题接收多个值...我怎么能摧毁所有一个主题的观察者,并在我需要的时候创造新的主题......?以下是plunker演示http://plnkr.co/edit/OKiljCekSKHO1zJF5MAy?p=preview
我打算在ngOnDestroy中销毁一个主题的观察者...
ngOnDestroy(){
this.srvc.DestroySubject();
}
有人可以告诉我如何销毁行为主体的观察者吗?
答案 0 :(得分:3)
预期会有这种行为。
export class Sample1 {
constructor(public srvc:HeroService) {
this.srvc.Data.subscribe(data=> {
console.log(data);
});
this.srvc.GetData();
}
}
在构造函数中,您订阅了srvc.Data
,因为Data
是BehaviorSubject
,它会返回最近发布的值。您使用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');
}
}