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;
}
}