我正在尝试在我的应用程序启动之前加载一些数据。我之所以需要这样做,是因为某些菜单根据某些用户条件(例如,基于用户位置)限制了访问。
因此,如果用户还没有位置或者它的位置没有启用访问某些视图,我需要阻止它。
我尝试使用 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
但在数据可用后它永远不会启用视图,它停留在空白页面上。