只是关于两个生命周期钩子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,则可能存在问题.