2つのライフサイクルフックOnInit
とOnDestroy
に関する一般的な質問です。このarticleに言及すると、私はいつもOnInit
がであると仮定していましたが、OnDestroy
の前には常にが実行されていました。角4 - OnInitが実行されずにOnDestroyを実行できますか?
私は、ngOnDestroy()
の中で、バックグラウンドミュージックトラックの再生を停止している場合があります。このサウンドはコンポーネントのngOnInit()
にロードされ、ngOnDestroy()
はngOnInit()
が実行されていない状態で実行されているため、サウンドオブジェクトはundefined
です。 .fade()
にundefined
だ音をしようとしたときにコードがngOnDestroy
に失敗している瞬間
コード
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);
}
。もちろん、これはundefined
ではないことを確認してから.fade()
関数を実行することで簡単に解決できます。私の前提は、ngOnDestroy()
が実行された場合、ngOnInit()
も実行されていなければならないということでした。私は間違っていたと思います。
このケースのため、私のアプリケーションでは、ngOnDestroy()
のすべての操作を実行する前に、使用されているオブジェクトがundefined
であるかどうかを確認する必要があると考えています。たとえば、サブスクリプションから退会する前に、私はサブスクリプションがundefined
であるかどうかを確認する必要があります。
そうでしょうか?
ご返信ありがとうございます。私はちょうど私の問題の原因を見つけました。コンポーネントが動的に作成されていて、リファクタリングのためにいくつかの古いコードを削除するのを忘れていて、そのコンポーネントが2回作成されていたことがわかりました。私はまだinitライフサイクルのフックの前にdestroyが実行可能かどうかを知ることに興味があります。私が言及したように、私はリンクされた記事でそれが起こる可能性があるようだが、それはそうであると仮定した。 –
あなたが投稿した記事でOnInitがトリガされない唯一の理由は、ルータが台無しになったため、コンストラクタで適切なコンポーネントのコンパイルができないことです。このような状況は、一般的にコンパイラではなく角型ルータに特有です。ルータはコンポーネントクラスを強制的にコンパイルせずに破棄します。これは通常の状況下では起こりません。私は解明のためにこれを答えに加えます。 – estus
ご理解ありがとうございます。 –