无法在CanActivate防护中为懒惰模块获取路由参数

时间:2016-12-13 16:22:01

标签: angular angular2-routing

我有一个以这种方式使用惰性模块的应用程序:

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属性中)。似乎这些数据可以在以后获得,但我无法找到获得它的方法......

实施此方法的方法是什么?谢谢你的帮助!

1 个答案:

答案 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