Вы должны различать beforeunload
нативное событие на window
и canDeactivate guard.
Первый срабатывает, когда вы пытаетесь закрыть вкладку / окно. Чтобы при его запуске вы могли запросить пользователя и выполнить event.preventDefault()
, чтобы отменить закрытие вкладки / окна.
Говоря о CanDeactivate
охраннике, он должен вернуть наблюдаемое / обещание / обычное значение логического значения, которое сообщит вам, можете ли вы деактивировать текущий маршрут.
Так что гораздо лучше разделить два метода (один для beforeunload
и второй для охранника). Потому что, если вы хотите, измените поведение, чтобы не просто использовать собственное приглашение, а ваше пользовательское модальное окно, обработчик событий по умолчанию для beforeunload
не будет работать, поскольку он обрабатывает код синхронизации. Так что для beforeunload
вы можете использовать подсказку только для того, чтобы попросить пользователя не покидать страницу.
loading = true;
@HostListener('window:beforeunload', ['$event'])
canLeavePage($event: any): Observable<void> {
if(this.loading && prompt('You data is loading. Are you sure you want to leave?')) {
$event.preventDefault();
}
}
Охрана в другой руке хочет вернуть логическое значение (или Обещание,
или наблюдаемый). Так что здесь вы можете просто вернуть результат вашего состояния:
canDeactivate(): boolean {
return this.loading && prompt('You data is loading. Are you sure you want to leave?');
}
Так что в вашем CanDeactivate
охраннике он будет использоваться как return component.canDeactivate()