我有一个以这种方式使用惰性模块的应用程序:
export const routes: Routes = [
{
path: '',
component: WelcomeComponent
},
{
path: 'items',
loadChildren: 'app/modules/items/items.module#ItemsModule'
}
];
export const AppRoutingModule: ModuleWithProviders
= RouterModule.forRoot(routes);
在ItemsModule
内,我想为其中一条子路线使用守卫:
const routes: Routes = [
{
path: ':slug', component: ItemComponent,
canActivate: [ ItemFetchGuard ]
}
];
export const coveragesRoutingModule: ModuleWithProviders =
RouterModule.forChild(routes);
该守卫需要获取slug
参数来获取数据:
@Injectable()
export class CoverageFetchGuard implements CanActivate {
constructor(
private service: ItemService,
private route: ActivatedRouteSnapshot,
private ngRedux: NgRedux<IAppState>) {}
canActivate() {
const slug = this.route.params['slug'];
return this.service.getItem(slug)
.map(item => {
this.ngRedux.dispatch(itemSuccessfullyFetched(item));
return true;
})
.catch(error => {
this.ngRedux.dispatch(itemFetchFailed(error));
return Observable.of(false);
});
}
}
问题是我无法在路由快照中找到slug
参数(即使在其children
属性中)。似乎这些数据可以在以后获得,但我无法找到获得它的方法......
实施此方法的方法是什么?谢谢你的帮助!
答案 0 :(得分:4)
我终于找到了&#34;问题&#34; (实际上并非如此)。我没有以正确的方式使用警卫。我们需要使用有关当前路由的提示,利用canActivate
方法的参数,而不是尝试从依赖注入中获取它们。
以下是获取参数的方法:
@Injectable()
export class ItemFetchGuard implements CanActivate {
canActivate(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot) {
const slug = this.snapshot.params['slug'];
(...)
return true;
}
}
这是相应的plunkr:this thread