【问题标题】:ngOnDestroy is called when loading the page for the first time第一次加载页面时调用 ngOnDestroy
【发布时间】:2019-04-08 13:58:37
【问题描述】:

当我第一次加载页面时,在某些页面上它会在 ngOnDestroy 中显示取消订阅错误,因为我正在取消订阅其中的订阅。

我不确定为什么在组件的初始化时调用 ngOnDestroy。

这是我第一次加载页面时看到的错误。

我认为这是 angular2-multiselect-dropdown 的一些问题,但在其他一些组件中,它自己的 ngOnDestory 也被调用,并表示未定义订阅取消订阅。

所以我添加了 if 条件来删除错误消息。

这是订阅的创建。

其实我认为定义 observable 没有其他问题。

那么这是角度组件生命周期的问题还是可能是 angular2-multiselect-dropdown 的问题?

我之前没有看到这个错误,也不知道我做错了什么。 任何人都可以有类似的问题或帮助我吗? 提前致谢。

【问题讨论】:

  • 能否请您显示创建代码“this.changeName$”
  • 你能创建一个工作示例吗?
  • @purplefeel 尝试在stackblitz.com 上重新创建问题。大多数情况下,尝试重现该问题也会向您展示您做错了什么。无论如何,没有您的代码,我们无法告诉您出了什么问题,所以请至少发布您的组件代码。
  • 我认为关键部分将是组件的 parent 的模板,该组件意外地被 ngOnDestroyed。有问题的孩子是否包含在一些 *ngIf 中,也许?
  • 在 init 函数之前的生命周期不太可能调用 destroy 函数。您可以在ngOnDestroy 中放置一个断点并查看堆栈跟踪以了解实际触发此代码的原因吗?

标签: angular lifecycle


【解决方案1】:

我在路由中使用过的组件也有类似的问题。如果我将日志记录添加到构造函数中,ngOnInit 和 ngOnDestroy 输出如下所示:

  • 构造函数
  • ngOnDestroy
  • 构造函数
  • ngOnInit

就我而言,问题是我如何使用<router-outlet>。简单地说我的模板看起来像这样:

<div *ngIf="hasLayout()">
    <app-navigation></app-navigation>
    <ng-container *ngTemplateOutlet="routerOutlet"></ng-container>
</div>

<div *ngIf="!hasLayout()">
    <ng-container *ngTemplateOutlet="routerOutlet"></ng-container>
</div>

<ng-template #routerOutlet>
    <router-outlet></router-outlet>
</ng-template>

(灵感来自:https://stackoverflow.com/a/51725607/7662651

我对其进行了更改,因此我的模板中只有一个 &lt;router-outlet&gt; 组件而没有 &lt;ng-template&gt;。类似这样:

<div *ngIf="hasLayout()">
    <app-navigation></app-navigation>
</div>

<router-outlet></router-outlet>

这种行为的原因是控制使用 &lt;router-outlet&gt; 的值的变化和异步身份验证保护的不幸组合。在我的例子中,auth 守卫正在等待登录被初始化并且初始化的登录切换&lt;router-outlet&gt;

下面是一个重现不良行为的示例: https://stackblitz.com/edit/angular-27vrnz

【讨论】:

    【解决方案2】:

    你的 rxjs 是什么版本的?

    如果 rx 是 v5,你可以在订阅者上使用 .unsubscribe(),但如果是 v4,你必须使用 .dispose()。

    这似乎是唯一的问题。

    【讨论】:

    • 它的版本是5. "rxjs": "^5.5.12",
    【解决方案3】:

    您是否在构造函数中重定向到不同的页面?

    根据这两个页面,只有在没有 onInit() 的情况下调用 onDestroy 时才有可能。 Angular 4 - Can OnDestroy be run without the OnInit ever being triggered?

    https://www.bennadel.com/blog/3356-ngoninit-may-not-get-called-before-ngondestroy-is-called-in-angular-4-4-6.htm

    【讨论】:

    • 感谢您的参考。我在构造函数中没有任何重定向。我发现当我用 F5 重新加载页面或重新编译时,它显示 ngOndestroy 错误,但是如果我首先在其他页面上重新加载并导航到它,它不会显示该错误。此外,它在初始化之后显示错误,简而言之,ngOnDestory 在初始化之后被调用,而 angular2-multiselect-dropdown 取消订阅错误在初始化之前显示,如屏幕截图所示。
    • 我正在做延迟加载模块,它可以与它相关吗?我得到了这个,所以也在弄清楚。 --- 在重建期间检测到 loadChildren 中的重复路径中的警告。我们将采用检测到的最新版本并覆盖它以节省重建时间。您应该执行完整构建以验证您的路线不重叠。 ---
    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多