Angular2 передает данные из CanActivate guard для разрешения разрешения?

У меня есть ситуация, когда я использовал Resolve для предварительной загрузки некоторых данных из удаленного источника по HTTP-вызову до перехода к компоненту. Теперь мне нужно реализовать некоторую защитную логику, которая требует, чтобы в зависимости от некоторых условий эти данные были предварительно загружены, чтобы проверить некоторые поля на нем против текущего пользователя.

Я бы хотел избежать того же запроса к CanActivate в CanActivate а затем сразу же после этого в Resolve.

Есть ли способ получить доступ к данным маршрута из CanActivate или конфигурации маршрута, чтобы временно переопределить преобразователь и просто установить значение для объекта данных, так как у меня есть то, что я собираюсь запросить?

Я попытался уйти с чем-то простым

route.data['myData'] = value;

Но это ошибка, потому что "объект не расширяется".

Я также пробовал что-то вроде:

this.router.routerState.root.data['myData'] = value;

Который не создает каких - либо ошибок, однако эти данные не сохранились в route.data элемент Resolve.resolve() метод.

Я бы хотел избежать слишком привычного или взломанного, например, временно хранить объект в Сервисе как какой-то кеш. Существует ли какой-либо стандартный механизм для передачи данных между внутренними элементами маршрутизатора для поддержки расширенной предварительной выборки и таких вещей, как проверки прав собственности?

РЕДАКТИРОВАНИЕ Маршрутизатор работает, если вы введете маршрутизатор в конструктор класса Resolve и получите доступ к нему аналогичным образом. Но это нужно очистить после этого, иначе он будет сохраняться между навигационными вызовами.

Ответы

Ответ 1

Свойство data из ActivatedRouteSnapshot неизменны, это причина, почему вы получите ошибку:

объект не расширяется

Но вы можете заменить весь объект, например:

@Injectable()
export class MyGuard implements CanActivate {
  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

    // Use the spread operator to keep the previously resolved data
    next.data = {...next.data, guardedData: 'guarded'};
    return true;
  }
}

И получить доступ к нему в вашем распознавателе

@Injectable()
export class FooResolver implements Resolve<any> {

  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<any>|Promise<any>|any {
    return route.data.guardedData;
  }

}