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

前端之家收集整理的这篇文章主要介绍了Angular 4 – 可以在没有触发OnInit的情况下运行OnDestroy吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
只是关于两个生命周期钩子OnInit和OnDestroy的一般性问题.正如 article提到的那样,我一直认为OnInit总是在OnDestroy之前运行.

我有一个案例,在ngOnDestroy()我停止播放背景音乐曲目.此声音加载了组件的ngOnInit(),并且因为在没有运行ngOnInit()的情况下运行ngOnDestroy(),声音对象是未定义的.

ngOnInit() {
    ...

    this.loadSounds();

    ...
}

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

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

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

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

我这样做是对的吗?

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

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

此组件使用的服务可能会导致该问题.在ngOnDestroy中抛出无法读取未定义或类似错误属性“淡入淡出”的事实意味着this.soundService.getSound(Sound.MINI_GAME_BG_MUSIC)未定义.

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

猜你在找的Angularjs相关文章