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)
你有一个服务,它是一个单例。该服务从应用程序开始一直存在到结束。
你有两个组件。这些不是单身人士。当它们必须显示在页面上时,它们被创建;当它们不能再显示时,它们被销毁。
并且,当创建组件时,您可以在单例服务中订阅一个可观察对象。这是什么意思?这意味着可观察对象需要保留对观察者的引用,观察者本身具有对组件实例的隐式引用(this)。如果没有该引用,可观察对象将无法在发出事件时调用观察者。因此,即使 Angular 不再需要您的组件实例,可观察对象仍然具有对它的引用,并在发出事件时调用它。
因此,当不再需要该组件时,您需要取消订阅:
private subscription: Subscription;
ngOnInit() {
this.subscription = this.service.getTestEvent().subscribe(...);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
Run Code Online (Sandbox Code Playgroud)
如果不这样做,不仅观察者会无所事事地调用,从而使应用程序变慢,而且还会出现内存泄漏。
| 归档时间: |
|
| 查看次数: |
6165 次 |
| 最近记录: |