只是关于两个生命周期挂钩OnInit
和OnDestroy
的一般性问题。正如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
,依此类推。
我这样做是对的吗?
答案 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
,则可能存在问题。