【问题标题】:Receiving multiple instances of data from Behavior Subject every time component is initialised每次初始化组件时从 Behavior Subject 接收多个数据实例
【发布时间】:2016-09-22 15:01:50
【问题描述】:

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

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

谁能告诉我如何摧毁一个行为主体的观察者?

【问题讨论】:

  • 我不知道我的答案中建议的解决方法是否是您想要的。如果您提供有关您尝试解决的实际问题的更多信息,我可能会提供更好的解决方案。

标签: angular rxjs


【解决方案1】:

这种行为是预期的。

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

在您订阅srvc.Data 的构造函数中,因为DataBehaviorSubject,它返回最近发出的值。你用null初始化Data,所以一开始没有数据。

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

如果您导航离开并返回,则 Sample1 会再次初始化并执行构造函数。第一件事是订阅srvc.Data。它从上次调用GetData()(当我们第一次导航到Heroes时)获取最后一个发出的值,即Received Data

接下来是对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

【讨论】:

  • 谢谢...这是一个很好的答案...但是我已经更新了我的 plunker 演示 plnkr.co/edit/OKiljCekSKHO1zJF5MAy?p=preview 以提供更多信息...我在第二条路线上有一个按钮,当我点击在该按钮上,我正在调用主题发出数据的服务,并且我将导航到其他组件...先生,在这种情况下我该怎么做。我应该改变这种情况的解决方法吗?
  • 棘手。在这种情况下,似乎存在两个Sample1 实例。取消订阅ngOnDestroy() 修复了它plnkr.co/edit/o2Onm3G43m1siDo7bA4H?p=preview
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多