Angular 角度4-OnDestroy可以在不触发OnInit的情况下运行吗?
这只是一个关于两个生命周期挂钩Angular 角度4-OnDestroy可以在不触发OnInit的情况下运行吗?,angular,Angular,这只是一个关于两个生命周期挂钩OnInit和ondestory的一般性问题。正如上面提到的,我一直假设OnInit总是在ondestory之前运行 我有一个例子,在ngondestory()中,我停止播放背景音乐曲目。此声音加载到组件的ngOnInit(),并且由于运行ngondestory()时没有运行ngOnInit(),因此声音对象是未定义的 代码 ngOnInit() { ... this.loadSounds(); ... } ngOnDestroy()
OnInit
和ondestory
的一般性问题。正如上面提到的,我一直假设OnInit
总是在ondestory
之前运行
我有一个例子,在ngondestory()
中,我停止播放背景音乐曲目。此声音加载到组件的ngOnInit()
,并且由于运行ngondestory()
时没有运行ngOnInit()
,因此声音对象是未定义的
代码
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);
}
此时,当尝试.fade()
一种未定义的声音时,代码在ngondestory
中失败。当然,在执行.fade()
函数之前,我可以通过检查声音是否未定义来轻松解决此问题。我的假设是,如果运行一个ngondestory()
,那么ngOnInit()
肯定也运行过-我猜我错了
现在由于这种情况,我认为在我的应用程序中的每个ngondestory()
中,我应该在执行任何操作之前检查所使用的对象是否未定义。例如,在取消订阅之前,我应该检查订阅是否未定义,依此类推
我这样想对吗 明确指出,OnInit
生命周期钩子在ondestory
之前。这种行为通常特定于编译器。解释特定于Angular router的行为以及指令实例化组件的方式<路由组件构造函数中的code>router.navigateByUrl()
,并阻止对其进行编译,因此生命周期不适用于它。这在正常情况下是不会发生的
问题中的代码并不意味着ngOnInit
不运行ngOnInit
调用可以轻松记录,以证明它运行
此组件使用的服务可能会导致此问题。无法读取未定义的属性“淡入淡出”或在ngondestory
中抛出类似错误的事实意味着此.soundService.getSound(Sound.MINI_GAME\u BG_MUSIC)
未定义
这完全取决于soundService
service内部发生的情况。如果loadSound
是异步的,并且在加载资源之前调用了ngondestory
,则可能存在问题。感谢您的回复。我刚刚找到了问题的原因。组件是动态创建的,我刚刚意识到,由于我在做一些重构,我忘记删除一些旧代码,组件被创建了两次。我仍然有兴趣知道销毁是否可以在init生命周期挂钩之前运行。正如我提到的,我假设它是这样工作的,尽管在我链接的文章中,它似乎可能会发生。在您发布的文章中,OnInit没有被触发的唯一原因是构造函数中阻止了正确的组件编译,因为路由器出了问题。这种情况对Angular router非常特殊,而不是一般的编译器。路由器在不编译组件类的情况下强制销毁组件类。这在正常情况下是不会发生的。我将把这一点添加到回答中,以便澄清。