Angular 4 - 可以在不触发 OnInit 的情况下运行 OnDestroy 吗?

标签 angular

只是关于两个生命周期 Hook OnInitOnDestroy 的一般性问题。作为这个article提到,我一直假设 OnInit 总是OnDestroy 之前运行。

我有一个案例,在 ngOnDestroy() 中我停止播放背景音乐轨道。此声音加载组件的 ngOnInit(),并且由于正在运行 ngOnDestroy() 而没有运行声音对象的 ngOnInit() 未定义

代码

ngOnInit() {
    ...

    this.loadSounds();

    ...
}

ngOnDestroy() {
    if (AppSettings.SOUNDS_ENABLED) {
        this.soundService.getSound(Sound.MINI_GAME_BG_MUSIC).fade(0.2, 0, 1500);
    }
}

private loadSounds() {
    this.soundService.loadSound(Sound.MINI_GAME_BG_MUSIC, SoundPathURL.MINI_GAME_BG_MUSIC, true, 0);
}

目前,当尝试 .fade() 未定义 的声音时,代码在 ngOnDestroy 中失败。当然,我可以通过在执行 .fade() 函数之前检查声音不是 undefined 来轻松解决这个问题。我的假设是,如果 ngOnDestroy() 运行,则 ngOnInit() 也必须运行 - 我想我错了。

现在,由于这种情况,我认为在我的应用程序中的每个 ngOnDestroy() 中,我应该在执行任何操作之前检查正在使用的对象是否为 undefined。因此,例如在取消订阅之前,我应该检查订阅是否为 undefined,等等。

我的假设对吗?

最佳答案

The reference明确指出 OnInit生命周期 Hook 在 OnDestroy 之前.此行为通常特定于编译器。 The article解释特定于 Angular 路由器的行为和方式 <router-outlet>指令实例化组件。 router.navigateByUrl()在路由组件构造函数中 triggers its immediate destruction并阻止它被编译,因此生命周期不适用于它。这在正常情况下不会发生。

问题中的代码并不意味着 ngOnInit不运行。 ngOnInit可以轻松记录调用以证明它运行。

此组件使用的服务可能会导致问题。 Cannot read property 'fade' of undefined 或类似错误的事实在 ngOnDestroy 中抛出意味着 this.soundService.getSound(Sound.MINI_GAME_BG_MUSIC)未定义。

这完全取决于内部发生的事情 soundService服务。如果loadSound是异步的,ngOnDestroy在加载资源之前调用,可能会出现问题。

关于Angular 4 - 可以在不触发 OnInit 的情况下运行 OnDestroy 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47267448/

相关文章:

angular - 加载 ngModel 后的生命周期 Hook

angular - 更改 Angular 6 中的默认 html 模板

java - 如何在 Angular 5 应用程序中使用 jaxrs (resteasy) 将 Set 或 List 映射到数组?

javascript - 如何访问函数之外的数据 - Angular/Javascript

angular - 使用 Angular 4 中的十进制管道进行 block 舍入

Angular2 - 添加新的 <li> 项目 onClick 事件

javascript - 未捕获( promise ): Error: Cannot read property of undefined

javascript - Angular 2如何连接生产文件

javascript - 在测试自定义指令时无法读取未定义的属性 'value',该指令使用 jasmine 在 Angular 中获取注入(inject)的表单控件

typescript - 使用 Angular 2 连接 Google Maps Nativescript 插件