加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 07:51:00 所属栏目:安全 来源:网络整理
导读:只是关于两个生命周期钩子OnInit和OnDestroy的一般性问题.正如 article提到的那样,我一直认为OnInit总是在OnDestroy之前运行. 我有一个案例,在ngOnDestroy()我停止播放背景音乐曲目.此声音加载了组件的ngOnInit(),并且因为在没有运行ngOnInit()的情况下运行n
只是关于两个生命周期钩子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,则可能存在问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读