如何知道组件当前是否是路由器插座中加载的组件

A.A*_*ram 5 eventemitter angular2-routing angular

我有一个带有延迟加载模块的应用程序。

在一个特定的延迟加载模块中,我有一个父组件,它具有router-outlet.

在该父组件中,我有一个按钮,它基本上使用共享服务(在延迟加载模块上提供)发出事件。

每个子组件(在 中加载router-outlet)都使用相同的共享服务订阅该事件!

我尝试使用英雄演示在以下plunkr 中重新创建我的用例。

打开开发工具以查看console消息。

  • 单击Heroes链接(默认情况下应选中)。
  • 单击列表中的英雄项目。
  • 单击Admin链接。
  • 单击Emit Test按钮(右上角导航)

您将在控制台中看到两个组件都收到了 Event,即使两个组件都不应该是“ Active ”!!!

1)这是设计使然吗?

2) 如何知道当前组件是否是活动组件?


总结/更新

根据我的理解,EventEmitter/Subject 可以被订阅多次,但是当取消订阅时你不能使用它/订阅它 AFAIK。

我的解决方案是:

1)在服务中,我结束了以下操作:

get(){
  if (!this.testEvent.closed) {
      this.testEvent.complete();
      this.testEvent.unsubscribe();
    }
    this.testEvent= new EventEmitter<void>();
    return this.testEvent;
  }
}
Run Code Online (Sandbox Code Playgroud)

2)在我订阅事件的每个组件中,我添加了 ngDestroy 并取消订阅事件:

  ngOnDestroy() {
    this.testEvent.unsubscribe();
  }
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 4

你有一个服务,它是一个单例。该服务从应用程序开始一直存在到结束。

你有两个组件。这些不是单身人士。当它们必须显示在页面上时,它们被创建;当它们不能再显示时,它们被销毁。

并且,当创建组件时,您可以在单例服务中订阅一个可观察对象。这是什么意思?这意味着可观察对象需要保留对观察者的引用,观察者本身具有对组件实例的隐式引用(this)。如果没有该引用,可观察对象将无法在发出事件时调用观察者。因此,即使 Angular 不再需要您的组件实例,可观察对象仍然具有对它的引用,并在发出事件时调用它。

因此,当不再需要该组件时,您需要取消订阅:

private subscription: Subscription;

ngOnInit() {
    this.subscription = this.service.getTestEvent().subscribe(...);
}

ngOnDestroy() {
    this.subscription.unsubscribe();
}
Run Code Online (Sandbox Code Playgroud)

如果不这样做,不仅观察者会无所事事地调用,从而使应用程序变慢,而且还会出现内存泄漏。