Перед каждым запросом я хочу убедиться, что профиль пользователя доступен. Для этого я использую охрану canActivateChild.
Согласно документации angular2 можно вернуть наблюдаемое: https://angular.io/api/router/CanActivateChild
app.routes.ts
export const routes: Routes = [
{
path: '',
canActivateChild: [ProfileGuard],
children: [
{
path: 'home',
component: HomeComponent,
canActivate: [AuthGuard]
},
{
path: 'login',
component: LoginComponent,
canActivate: [GuestGuard]
},
}
];
canActivatedChild
выполняется перед дочерним маршрутом canActivate
профиль.guard.ts:
export class ProfileGuard implements CanActivateChild {
constructor(private profileService: ProfileService, private snackbar: MdSnackBar) { }
canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> {
if (this.profileService.user == null && localStorage.getItem('__token') != null) {
return this.profileService.loadProfile().map((user) => {
console.log('profile loaded');
this.profileService.user = <UserModel>user.data;
return true;
});
}
return true;
}
}
Функция профиля нагрузки:
public loadProfile(): Observable<any> {
console.log('load');
return this.http.get('/profile').map(res => res.json());
}
Когда я перемещаюсь по меню (<a>
с routeLink
), console.log('profile loaded')
работает. Но если я перезагружаю страницу с помощью f5 или через браузер, он никогда не попадает туда.
console.log('load')
всегда выполняется.
ИЗМЕНИТЬ:
Если я в canActivateChild
вернусь:
return Observable.of(true).map(() => {
console.log('Test');
return true;
});
Он отлично работает... Я получаю console.log('test')
Observable.of(true)
вместо вызоваthis.profileService.loadProfile()
? - person BeetleJuice   schedule 22.07.2017console.log
изcanActivateChild()
(не из самой цепочки Observable), это сработает? - person BeetleJuice   schedule 22.07.2017canActivateChild()
, аObservable.of(true)
работает, как и ожидалось, в первый раз я ошибся - person Rick Lenes   schedule 22.07.2017