меню

Интерфейс CanDeactivate применяется классом, который должен принимать решение, можно ли деактивировать роут. Напишем сервис реализующий интерфейс CanDeactivate:

 
import { Observable } from "rxjs/Observable";
import { 
  CanDeactivate,
  ActivatedRouteSnapshot,
  RouterStateSnapshot
} from "@angular/router";

export interface CanComponentDeactivate {
  canDeactivate: () => Observable<boolean> | Promise<boolean> | boolean;
}

export class CanDeactivateGuard implements CanDeactivate<CanComponentDeactivate> {
  canDeactivate(
    component: CanComponentDeactivate,
    currentRoute: ActivatedRouteSnapshot,
    currentState: RouterStateSnapshot,
    nextState?: RouterStateSnapshot
  ): Observable<boolean> | Promise<boolean> | boolean {
    return component.canDeactivate ? component.canDeactivate() : true;
  }
}
 

Сервис не знает деталей реализации метода деактивации у компонента. Он только проверяет, что у компонента есть метод canDeactivate() и запускает его.

Класс реализует интерфейс CanComponentDeactivate:

  
export class EditServerComponent implements OnInit, CanComponentDeactivate {
  //...
  canDeactivate(): Observable<boolean> | Promise<boolean> | boolean {
    if (!this.allowEdit) {
      return true;
    }

    const isSettingsChanged = this.serverName !== this.server.name 
      || this.serverStatus !== this.server.status;

    if (isSettingsChanged 
      && !this.changesSaved) {
      return confirm('Do you want discard the changes?'); 
    } else {
      return true;
    }
  }
}
 

Routes должен содержать ключ canDeactivate с именем сервиса:

 
{
 //...
 children: [
   //...,
    {
     path: ':id/edit', 
      component: EditServerComponent,
     canDeactivate: [CanDeactivateGuard]
   },
  ]
}
  

Сервис нужно зарегистрировать в провайдерах модуля.

Помощь сайту
ЮMoney:
4100 1180 7209 833
Карта Сбербанк:
2202 2080 6183 7127

Возможно, вам будет интересно

Компонент и модель

Angilar создание обычных и вложенных компонентов через CLI. Описание модели.

Инкапсуляция стилей и ссылки

Режимы инкапсуляции стилей, локальная ссылка в шаблоне Angular. Доступ к шаблону и DOM из компонента с помощью @ViewChild и @ContentChild.

Route. Вынос настроек роутера

Пример переноса роутинговой конфигурации Angular5 в отдельный файл

Навигация. Передача данных событиями

Навигация в Angular на основе событий. Передача данных между вложенными компонентами с помощью событий в Angular