Navigation 离子角组件:如何破坏?

Navigation 离子角组件:如何破坏?,navigation,angular7,ionic4,Navigation,Angular7,Ionic4,我有一个Ionic 4应用程序,有一个自定义组件的angular 7。在这个组件中,我实现了对事件的订阅。当事件发布时,我会毫无问题地收到消息。如果我离开组件并再次返回,如果发布事件,我会收到两次消息。似乎同一控制器的前一个实例没有被销毁(同样,如果触发了Ngondestory,我已经插入了一个console.log)。 如果我重复这个动作(离开和返回),我会收到3条消息,然后是4条,以此类推 所以,我的问题是:这个组件是被破坏了还是保留在内存中 我很抱歉,每次我输入一个组件时,我都会有一个新实

我有一个Ionic 4应用程序,有一个自定义组件的angular 7。在这个组件中,我实现了对事件的订阅。当事件发布时,我会毫无问题地收到消息。如果我离开组件并再次返回,如果发布事件,我会收到两次消息。似乎同一控制器的前一个实例没有被销毁(同样,如果触发了Ngondestory,我已经插入了一个console.log)。 如果我重复这个动作(离开和返回),我会收到3条消息,然后是4条,以此类推

所以,我的问题是:这个组件是被破坏了还是保留在内存中


我很抱歉,每次我输入一个组件时,我都会有一个新实例,而以前的所有实例都会被销毁。

从您的描述来看,您的订阅似乎与组件的生命周期无关

如果你不退订,每次有新的活动,它都会继续收听并发出警报。即使angular删除了旧组件实例,不再使用它,浏览器也会将其保留在内存中,以便能够为事件处理程序提供上下文


您是否尝试使用Ngondestory方法明确取消订阅?

我在项目中遇到了类似的问题,每次访问页面时打开的模态数量都在增加。原来是订阅问题

我在那里做的是,如果子组件存在于父页面中,我们将其称为Ngondrestory(您必须在某个页面中导入该组件),每次离开父页面(ionViewWillLeave)时都会这样做:

或者,您可以使用父页面的Ngondestory和ngOnInit,但请确保在您假定调用它们时调用它们(Ionic堆栈页面,而不是销毁它们,并且仅当该页面位于堆栈顶部,然后从堆栈中移除时才调用Ngondestry,否则在页面离开或进入时,它将使用其附加的生命周期挂钩。)


根据您的问题,这肯定是一个订阅问题。我会要求您检查订阅部分并调试它,以查看是否在需要时调用取消订阅。

在Ngondestory方法中,我会取消订阅所有事件。销毁后组件似乎仍在内存中。如果您已经取消订阅你推断组件留在内存中是有根据的。你是否有可能将组件用作ionic页面?ionic会在一定程度上缓存这些组件,并提供自定义生命周期方法来处理页面的进入/离开。如果是这种情况,你只需将订阅移动到某个只执行一次的位置,l或者使用离子生命周期方法,而不是角度方法。
@ViewChild(someChildComponent) child;
subscriptions;

ionViewWillEnter() {
    // your initialization goes here
}

ionViewWillLeave() {
    this.subscriptions.unsubscribe;
    if (this.child) {
      this.child.ngOnDestroy();
    }
}