У меня есть какое-то всплывающее окно "Несохраненные изменения", где пользователь может отменить обратную навигацию.В этом случае, когда пользователь нажимает кнопку отмены (canDeactivate
guard возвращает false), но затем пытается вернуться назад (вызывается canDeactivate
), и пользователь выбирает «оставить без сохранения» (canDeactivate
guard возвращает true),навигация назад происходит дважды.
компонент
@HostListener('window:beforeunload')
canDeactivate(): Observable<boolean> | boolean {
return !this.unsavedChangesAvailable;
}
охранник
canDeactivate(
component: BLAComponent,
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
if (!component.canDeactivate()) {
this.unsavedChangesModal = this.dialog.open(UnsavedChangesModalComponent, {
height: 'auto',
width: 'auto'
});
return this.unsavedChangesModal.afterClosed().pipe(
map((choice: boolean) => {
return choice;
}));
} else {
return of(true);
}
}
модальный
<button mat-button [mat-dialog-close]="false" cdkFocusInitial>
{{ 'EDITOR.UNSAVED_CHANGES_MODAL.CANCEL' | translate }}</button>
<button mat-button [mat-dialog-close]="true">{{
'EDITOR.UNSAVED_CHANGES_MODAL.LEAVE_WITHOUT_SAVE' | translate }}
</button>
Проблема возникает в Angular 6, но такжев последней версии 8. Я обновил его, потому что я думал, что проблема была решена (https://github.com/angular/angular/issues?utf8=%E2%9C%93&q=is%3Aissue+candeactivate+twice),, но обновление не решило проблему.