2017-11-13 18 views
2

2つのライフサイクルフックOnInitOnDestroyに関する一般的な質問です。この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であるかどうかを確認する必要があります。

そうでしょうか?

答えて

1

The referenceは、OnInitライフサイクルフックが先にOnDestroyであることを明確に示しています。この動作は、一般的なコンパイラに固有です。 The articleは、角度ルータに固有の動作と、<router-outlet>ディレクティブがコンポーネントをインスタンシエートする方法を説明しています。ルートコンポーネントコンストラクタtriggers its immediate destructionrouter.navigateByUrl()をコンパイルしないようにするため、ライフサイクルは適用されません。これは通常の状況下では起こりません。

質問のコードは、ngOnInitが実行されないことを意味するものではありません。 ngOnInit呼び出しが容易に実行されることを証明するためにログに記録されます。

このコンポーネントで使用されているサービスで問題が発生する可能性があります。 またはそれに類するエラーのプロパティ 'fade'を読み取ることができないことがngOnDestroyにスローされるということは、this.soundService.getSound(Sound.MINI_GAME_BG_MUSIC)が定義されていないことを意味します。

これは、サービス内で何が起こるかによってまったく異なります。 loadSoundが非同期で、リソースがロードされる前にngOnDestroyが呼び出された場合、問題が発生する可能性があります。

+0

ご返信ありがとうございます。私はちょうど私の問題の原因を見つけました。コンポーネントが動的に作成されていて、リファクタリングのためにいくつかの古いコードを削除するのを忘れていて、そのコンポーネントが2回作成されていたことがわかりました。私はまだinitライフサイクルのフックの前にdestroyが実行可能かどうかを知ることに興味があります。私が言及したように、私はリンクされた記事でそれが起こる可能性があるようだが、それはそうであると仮定した。 –

+1

あなたが投稿した記事でOnInitがトリガされない唯一の理由は、ルータが台無しになったため、コンストラクタで適切なコンポーネントのコンパイルができないことです。このような状況は、一般的にコンパイラではなく角型ルータに特有です。ルータはコンポーネントクラスを強制的にコンパイルせずに破棄します。これは通常の状況下では起こりません。私は解明のためにこれを答えに加えます。 – estus

+0

ご理解ありがとうございます。 –

関連する問題