Is there any lifecycle hook like window.onbeforeunload in Angular2? I already googled and searched on stackoverflow, but found nothing
Important note for iOS
The beforeunload
event isn't supposed - presumably due to the high level of 'abuse'
over the years.
Instead you can use pagehide as recommended by Apple.
This is part of the Page visibility
API.
https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
So I can't seem to get pagehide
to fire on desktop chrome, and I can't get beforeunload
to fire on iOS Safari - so you need both - but make sure not to fire your code twice.
@HostListener('window:beforeunload')
@HostListener('window:pagehide')
This worked for me. Defined in the page component constructor
window.addEventListener("beforeunload", (event) => {
event.preventDefault();
event.returnValue = "Unsaved modifications";
return event;
});
Define the returnValue
only if you want to prompt user before unload.
Work only if the user interract with the page (e.g. click).
This is more of an added note than an answer but I can't really comment right now.
Still, I wanted to add this:
I wouldn't say it's too complicated of initialization logic, but if you do decide to add the event listener on component initialization it would be best to include this in ngOnInit rather than the constructor:
window.addEventListener('beforeunload', function (e) {
e.preventDefault();
e.returnValue = '...';
});
This is especially if you are including additional logic before unload.
There's also a good article on ngOnDestroy which works similarly to a destructor for directives, pipes, and services. Both approaches are convenient depending on what operations you wish to perform.
Full link text:
https://wesleygrimes.com/angular/2019/03/29/making-upgrades-to-angular-ngondestroy.html
credit to Günter Zöchbauer's original answer
Günter Zöchbauer's answer is slightly wrong on two one count, this is what worked for me:
@Component({
selector: 'xxx',
..
)}
class MyComponent {
@HostListener('window:beforeunload', ['$event'])
doSomething($event) {
if(this.hasChanges) $event.returnValue='Your data will be lost!';
}
}
There are two main differences from Günter's answer:
@HostListener
should be window:beforeunload
and not window:onbeforeunload
$event.returnValue
instead<div (window:beforeunload)="doSomething()"></div>
or
@Component({
selector: 'xxx',
host: {'window:beforeunload':'doSomething'}
..
)}
or
@Component({
selector: 'xxx',
..
)}
class MyComponent {
@HostListener('window:beforeunload')
doSomething() {
}
}
This is how to listen to global events. I don't know if the special behavior of this event is supported where the return value is used as text for the conformation dialog.
You can still use
export class AppComponent {
constructor() {
window.onbeforeunload = function(e) {
return 'Dialog text here.';
};
}
}
Like explained here https://developer.mozilla.org/de/docs/Web/API/WindowEventHandlers/onbeforeunload