Я пытаюсь загрузить некоторые данные до запуска моего приложения. Причина, по которой мне нужно это сделать, заключается в том, что некоторые меню имеют ограниченный доступ на основе некоторых условий пользователя, например, на основе местоположения пользователя.
Поэтому, если у пользователя еще нет местоположения или его местоположение не позволяет получить доступ к определенному представлению, мне нужно его заблокировать.
Я пытался использовать метод Angular Resolve, но безуспешно, вот что я сделал:
Разрешить охрану
// The apiService is my own service to make http calls to the server.
@Injectable()
export class AppResolveGuard implements Resolve<any> {
constructor(
private _api: ApiService,
private _store: Store<IStoreInterface>,
) { }
resolve(): any {
return this._api.apiGet('loadData').subscribe(response => {
this._store.dispatch({
type: USER_FETCH_DATA,
payload: response.usuario
});
return response;
});
}
}
Маршрутизация
export const routing = [
{
path: '', component: AppComponent, canActivateChild: [AuthGuard], resolve: {app: AppResolveGuard},
children: [
{ path: 'home', component: HomeComponent },
{ path: 'company', canActivate: [LocationGuard], component: CompanyComponent },
]
}
];
AuthGuard просто проверит действительный сеанс cookie.
Как видите, маршрутизация, доступ к которой я пытаюсь заблокировать, — это маршрутизация company
. Я могу запретить доступ, когда я впервые загружаю другую страницу, например, если первый доступ к странице home
, а затем я перехожу на страницу company
, проверка работает нормально, поскольку данные пользователя и местоположение уже доступны.
Однако, если первый доступ будет к странице company
, он заблокирует всех пользователей для перехода туда, потому что в то время, когда LocationGuard
пытается проверить местоположение пользователя, данные еще не доступны.
Я также пытался заменить Resolve
на CanActivate
, но он никогда не включает представление после того, как данные доступны, он остается на пустой странице.