2016-12-30 9 views
2

この質問には多くの回答があるようですが、私は何をすべきかを理解できませんでした。データが変更されたときのコンポーネントの再作成

私は現在、他の子コンポーネントから再生ボタンをクリックしたときに作成される子コンポーネントがあります。これは、親とデータを共有し、次に親がデータを渡し、子オーディオプレーヤコンポーネントを作成するサービスを通じて起こります。私が抱えている問題は、ユーザーが別のページに移動して、そのページのオーディオを再生するためにクリックして、古いオーディオが引き続き存在し、新しいオーディオが開始しない場合です。

古いオーディオコンポーネントを破棄して新しいオーディオonclickを作成するためのライフサイクルフックや方法がありますか?

情報ボックス - 再生ボタンをクリックしたときに最初の起動が行われる場所。

export class InfoBoxComponent implements OnInit { 
    ... 

    activateAudioPlayer(session) { 
    this.newAudioService.newAudio(session) 
    } 
} 

新しいオーディオサービス

export class NewAudioService { 
    newActiveAudioSource: Subject<string> = new Subject<string>(); 

    newAudio(session) { 
    this.newActiveAudioSource.next(session); 
    } 

    newActiveAudio$ = this.newActiveAudioSource.asObservable(); 
} 

フロントエンドコンポーネント - 情報ボックスやオーディオプレーヤー

@Component({ 
    template: `<audio-player *ngIf='newActiveAudio' [newActiveAudio]='newActiveAudio'></audio-player>`, 
}) 

export class FrontendComponent implements OnInit { 

    ... 

    ngOnInit() { 
    this.sub = this.newAudioService.newActiveAudio$.subscribe(
     newActiveAudio => { 
     this.newActiveAudio = newActiveAudio; 
     }); 
    } 

    ngOnDestroy() { 
    // prevent memory leak when component destroyed 
    this.sub.unsubscribe(); 
    } 
} 
+0

'InfoBoxComponent'は、何回も作成されてから何度も破壊され、それはオーディオ要素も破壊するはずですか? – martin

+0

InfoBoxComponentはfrontendComponentのonInitで作成され、audioplayerComponentはinfoBoxComponentのボタンがクリックされると作成されます。私はこれを行うので、ユーザーは自分のサイトをナビゲートして、再生したい別の選択肢が見つかるまでオーディオを再生させることができます。問題は、audioPlayerComponentが初期化された後に、私はそれを破棄して別のデータで再作成する方法が必要になることです。申し訳ありませんが私は私の元の質問ではっきりしていない場合。 – Jleibham

+1

ただ、これが動作するかどうか好奇心: 'this.sub = this.newAudioService.newActiveAudio $ .subscribe( newActiveAudio => { this.newActiveAudio = NULL; this.newActiveAudio = newActiveAudio; });しかし' 、私はでしょう'audio-player'の中で' OnChange'を使い、古いオーディオオブジェクトをアンロード(停止/一時停止/破棄)した後、新しいオーディオオブジェクトをロードすべきです。 –

答えて

0

可能な方法を設定することができた親コンポーネントthis.newActiveAudio = falseその後、角度の更新プログラムをsetTimeout()と表示をさせますnewActiveAudioの新しい値を設定します。

+0

この作品をクール!唯一の問題は古いオーディオが引き続き再生されることですが、これはオーディオファイルを動的に追加するためです。私はaudioplayerのオーディオ要素onInitを殺すことができると確信しています。 – Jleibham

+0

DOMから要素を削除するだけでは再生が停止することはわかりません... – martin

関連する問題