CanDeactivateGuard не работает с подтверждением подписки

Мне нужно создать canDeactiovateGuard, чтобы пользователь не терял данные формы при попытке покинуть страницу формы. Этот код ниже не работает, так как return canDeactivate работает до подтверждения canDeactivate =. Я не знаю, как это исправить.

@Injectable()
export class CanDeactivateGuard implements CanDeactivate<Component> {

  canDeactivate(component: Component): boolean {
    let canDeactivate: boolean;
    if (component.formValueChanged) {
        component.confirmService.confirm("You have unsaved data. Are you sure?")
            .pipe(first())
            .subscribe((confirmed: boolean) => {
                canDeactivate = confirmed;
            });
    } else {
        canDeactivate = true;
    }
    return canDeactivate;
  }

}

1 ответ

Вместо этого попробуйте вернуть Observable<boolean>. Это можно сделать с помощью таких операторов, как RxJS map. В любом случае, в таких охранниках, как CanDeactivate или CanActivate, вы бы никогда не использовалиsubscribe() поскольку вы не можете ничего вернуть изнутри subscribe() и вместо этого вернуться Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree:

import { map } from 'rxjs/operators';

@Injectable()
export class CanDeactivateGuard implements CanDeactivate<Component> {

  canDeactivate(component: Component): Observable<boolean> | boolean {
    if (component.formValueChanged) {
        // Return the observable instead of the subscription
        return component.confirmService.confirm("You have unsaved data. Are you sure?")
            .pipe(first())
            // You may be able to remove map() assuming confirm() always returns Observable<boolean>
            .map((confirmed: boolean) => confirmed);
    }

    return false;
  }
}
Другие вопросы по тегам