0

我有路线配置

const appRoutes: Routes = [
  { path: '', loadChildren: 'app/+home/home.module#HomeModule' },
  { path: 'auth', loadChildren: 'app/+auth/auth.module#AuthModule' },
  { path: ':category', loadChildren: 'app/+search/search.module#SearchModule' },
  {
    path: '**',
    component: PageNotFoundComponent,
    data: { title: 'Page not found' }
  },
];

我需要检查:category路由参数值是否作为搜索类别存在于数据库中,如果存在则激活路由,否则转到 404 页面(在本例中为 PageNotFoundComponent)。

使用 CanActivate 是最好的方法吗?导航到 404 页面怎么样?

4

1 回答 1

1

是的,你可以使用CanActivate警卫。

{
  path: ':category',
  loadChildren: 'app/+search/search.module#SearchModule'
  canActivate: [CanActivateCategory]
},

然后,在警卫内部进行重定向:

@Injectable()
class CanActivateCategory implements CanActivate {

  constructor(private router: Router,
              private categoryService: CategoryService) {}

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean>|Promise<boolean>|boolean {
    const obs = this.categoryService.categoryExists(route.params['category']);
    obs.subscribe((exists: boolean) => {
      if (!exists) this.router.navigate('/404');
    });
    return obs;
  }
}

此代码假定您有一个CategoryService来验证类别的存在,并且您已经为 path 声明了一个路由/404

最后说明:如果您需要为当前预加载一些数据:category,我会将这段代码放在一个Resolve. 这样,您可以在一个地方完成所有操作:预加载数据,或者如果无法找到/预加载数据,则重定向到/404.

于 2017-01-23T11:44:40.807 回答