Existe-t-il un crochet de cycle de vie tel que window.onbeforeunload dans Angular2? J'ai déjà googlé et cherché sur stackoverflow, mais je n'ai rien trouvé
<div (window:beforeunload)="doSomething()"></div>
ou
@Component({
selector: 'xxx',
Host: {'window:beforeunload':'doSomething'}
..
)}
ou
@Component({
selector: 'xxx',
..
)}
class MyComponent {
@HostListener('window:beforeunload')
doSomething() {
}
}
Voici comment écouter les événements mondiaux. Je ne sais pas si le comportement spécial de cet événement est pris en charge lorsque la valeur de retour est utilisée comme texte pour le dialogue de conformation.
Vous pouvez toujours utiliser
export class AppComponent {
constructor() {
window.onbeforeunload = function(e) {
return 'Dialog text here.';
};
}
}
Comme expliqué ici https://developer.mozilla.org/de/docs/Web/API/WindowEventHandlers/onbeforeunload
La réponse de Günter Zöchbauer est légèrement fausse sur deux un chef d'accusation, c'est ce qui a fonctionné pour moi:
@Component({
selector: 'xxx',
..
)}
class MyComponent {
@HostListener('window:beforeunload', ['$event'])
doSomething($event) {
if(this.hasChanges) $event.returnValue='Your data will be lost!';
}
}
La réponse de Günter présente deux différences principales:
@HostListener
devrait être window:beforeunload
et pas window:onbeforeunload
$event.returnValue
au lieuCela a fonctionné pour moi. Défini dans le constructeur du composant de page
window.addEventListener("beforeunload", (event) => {
event.preventDefault();
event.returnValue = "Unsaved modifications";
return event;
});
Définissez le returnValue
uniquement si vous souhaitez demander à l'utilisateur avant le déchargement.
Ne fonctionne que si l'utilisateur interagit avec la page (par exemple, un clic).
Note importante pour iOS
L'événement beforeunload
n'est pas supposé - probablement à cause du nombre élevé d'abus au fil des ans.
Au lieu de cela, vous pouvez utiliser pagehide comme recommandé par Apple .
Cela fait partie de la Page visibility
API.
https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
Donc, je n'arrive pas à obtenir que pagehide
se déclenche sur un ordinateur de bureau chromé, ni à beforeunload
à se déclencher sur iOS Safari - vous avez donc besoin des deux - mais veillez à ne pas déclencher votre code deux fois.
@HostListener('window:beforeunload')
@HostListener('window:pagehide')