Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度4-OnDestroy可以在不触发OnInit的情况下运行吗?_Angular - Fatal编程技术网

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非常特殊,而不是一般的编译器。路由器在不编译组件类的情况下强制销毁组件类。这在正常情况下是不会发生的。我将把这一点添加到回答中,以便澄清。