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

时间:2017-11-13 15:07:50

标签: angular

只是关于两个生命周期挂钩OnInitOnDestroy的一般性问题。正如article提到的那样,我始终认为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);
}

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

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

我这样做是对的吗?

1 个答案:

答案 0 :(得分:3)

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

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

此组件使用的服务可能会导致问题。 无法读取属性&#39;淡出&#39; ngOnDestroy中引发了未定义的或类似错误,表示this.soundService.getSound(Sound.MINI_GAME_BG_MUSIC)未定义。

这完全取决于soundService服务中发生的事情。如果loadSound是异步的,并且在加载资源之前调用了ngOnDestroy,则可能存在问题。