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

Dan*_*ima 6 angular

只是一个关于两个 Lifecycle HooksOnInit和 的一般问题OnDestroy。正如本文提到的,我一直假设OnInit始终 在.OnDestroy

我有一个例子,ngOnDestroy()我正在停止播放背景音乐。该声音已加载组件的ngOnInit(),并且由于ngOnDestroy()正在运行而未ngOnInit()运行声音对象undefined

代码

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);
}
Run Code Online (Sandbox Code Playgroud)

目前,当ngOnDestroy尝试发出.fade()的声音时,代码失败undefinedundefined当然,我可以通过在执行函数之前检查声音是否存在来轻松解决此问题.fade()。我的假设是,如果ngOnDestroy()运行了,ngOnInit()那么也必须运行 - 我想我错了。

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

我这样的假设正确吗?

Est*_*ask 5

该参考文献明确指出OnInit生命周期钩子先于OnDestroy。一般来说,此行为特定于编译器。本文解释了 Angular 路由器特有的行为以及指令实例化组件的方式<router-outlet>router.navigateByUrl()在路由组件构造函数中,会触发其立即销毁并阻止其被编译,因此生命周期不适用于它。正常情况下不会发生这种情况。

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

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

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