Angular2嵌套模块内路由配置及登录跳转场景实现方案问询
我来帮你一步步搞定Angular嵌套模块的路由配置,完全匹配你要的URL规则和导航逻辑:
步骤1:配置根路由(
app-routing.module.ts) 根路由要处理默认跳转登录页,以及受保护的pi3路由入口,只有通过AuthGuard验证的用户才能进入pi3模块:
import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { PiLoginComponent } from './pi-login/pi-login.component'; import { AuthGuard } from './auth.guard'; // 假设你已实现登录守卫 const routes: Routes = [ { path: '', redirectTo: 'login', pathMatch: 'full' }, // 首次加载默认跳转到login { path: 'login', component: PiLoginComponent }, { path: 'pi3', canActivate: [AuthGuard], // 验证通过才能进入该模块 loadChildren: () => import('./piLayout/pilayout.module').then(m => m.PilayoutModule) }, { path: '**', redirectTo: 'login' } // 404页面跳转回登录页 ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }
步骤2:配置PiLayoutModule的路由(
pilayout-routing.module.ts) PiLayout作为父容器组件,它的路由要承载Home、Dashboards等子模块。这里path设为空,因为根路由已经指定了pi3,子路由会自动拼接成pi3/xxx格式:
import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { PilayoutComponent } from './pilayout.component'; const routes: Routes = [ { path: '', // 对应根路由的pi3,所以这里留空 component: PilayoutComponent, children: [ // 加载HomeModule,对应URL:pi3/home { path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) }, // 加载DashboardsModule,后续子路由会拼接成pi3/dashboards/commandashboard { path: 'dashboards', loadChildren: () => import('./dashboards/dashboards.module').then(m => m.DashboardsModule) } ] } ]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class PilayoutRoutingModule { }
别忘了在PilayoutModule里导入路由模块并声明组件:
import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { PilayoutComponent } from './pilayout.component'; import { PilayoutRoutingModule } from './pilayout-routing.module'; @NgModule({ declarations: [PilayoutComponent], imports: [ CommonModule, PilayoutRoutingModule ] }) export class PilayoutModule { }
步骤3:配置HomeModule的路由(
home-routing.module.ts) HomeModule的路由path设为空,这样访问pi3/home时,HomeComponent会渲染在PilayoutComponent的<router-outlet>中:
import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { HomeComponent } from './home.component'; const routes: Routes = [ { path: '', component: HomeComponent } ]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class HomeRoutingModule { }
步骤4:配置DashboardsModule的路由(
dashboards-routing.module.ts) 这里处理pi3/dashboards/commandashboard的路由,path设为commandashboard,拼接后就是你要的完整URL:
import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { CommandashboardComponent } from './commandashboard/commandashboard.component'; const routes: Routes = [ { path: 'commandashboard', component: CommandashboardComponent } ]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class DashboardsRoutingModule { }
步骤5:AuthGuard核心实现
确保登录守卫能正确判断用户状态,验证失败时自动跳回登录页:
import { Injectable } from '@angular/core'; import { CanActivate, Router } from '@angular/router'; import { AuthService } from './auth.service'; // 假设你有处理登录状态的服务 @Injectable({ providedIn: 'root' }) export class AuthGuard implements CanActivate { constructor(private authService: AuthService, private router: Router) {} canActivate(): boolean { if (this.authService.isLoggedIn()) { // 自定义判断登录状态的方法 return true; } else { this.router.navigate(['/login']); return false; } } }
关键检查点
- 务必在
PilayoutComponent的模板中添加<router-outlet>,否则子模块组件无法渲染 - 登录成功后,用
this.router.navigate(['/pi3/home'])触发导航到目标页面
这样配置后,完全满足你的需求:
- 首次加载默认进入login组件
- 验证通过后导航至PiLayoutModule下的HomeModule,URL为
pi3/home - 支持
pi3/dashboards/commandashboard这类嵌套URL格式
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

