この質問には多くの回答があるようですが、私は何をすべきかを理解できませんでした。データが変更されたときのコンポーネントの再作成
私は現在、他の子コンポーネントから再生ボタンをクリックしたときに作成される子コンポーネントがあります。これは、親とデータを共有し、次に親がデータを渡し、子オーディオプレーヤコンポーネントを作成するサービスを通じて起こります。私が抱えている問題は、ユーザーが別のページに移動して、そのページのオーディオを再生するためにクリックして、古いオーディオが引き続き存在し、新しいオーディオが開始しない場合です。
古いオーディオコンポーネントを破棄して新しいオーディオ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();
}
}
'InfoBoxComponent'は、何回も作成されてから何度も破壊され、それはオーディオ要素も破壊するはずですか? – martin
InfoBoxComponentはfrontendComponentのonInitで作成され、audioplayerComponentはinfoBoxComponentのボタンがクリックされると作成されます。私はこれを行うので、ユーザーは自分のサイトをナビゲートして、再生したい別の選択肢が見つかるまでオーディオを再生させることができます。問題は、audioPlayerComponentが初期化された後に、私はそれを破棄して別のデータで再作成する方法が必要になることです。申し訳ありませんが私は私の元の質問ではっきりしていない場合。 – Jleibham
ただ、これが動作するかどうか好奇心: 'this.sub = this.newAudioService.newActiveAudio $ .subscribe( newActiveAudio => { this.newActiveAudio = NULL; this.newActiveAudio = newActiveAudio; });しかし' 、私はでしょう'audio-player'の中で' OnChange'を使い、古いオーディオオブジェクトをアンロード(停止/一時停止/破棄)した後、新しいオーディオオブジェクトをロードすべきです。 –