javascript - Angular 2+ |如何在 NgModule 中使用参数定义路由

标签 javascript angular typescript

我对 Angular 路由很陌生,找不到针对这种情况的任何解决方案。我有一个登录组件和一个用户模块。有一个<router-outlet>在 App 组件中,一个在 User 模块中的 UserBase 组件中。这是我的路由声明。

应用程序模块.ts

const routes: Routes = [
  {
    path: 'login',
    component: LoginComponent
  },
];

imports: [
    RouterModule.forRoot(routes),
    UserModule,
],

用户.module.ts

const routes: Routes = [
  {
    path: ':username',
    component: UserBaseComponent,
    children: [
      {
        path: '',
        component: UserDetailsComponent,
      },
      {
        path: 'progress',
        component: ProgressComponent,
      },
      {
        path: 'timeline',
        component: TimelineComponent,
      },
      {
        path: 'leaderboard',
        component: LeaderboardComponent,
      }
    ],
  }
];

imports: [
    RouterModule.forChild(routes)
]

它可以很好地处理用户模块的路径,但它始终将“登录”识别为用户名,而不是导航到登录组件。实际上,如果我像这样在参数之前添加一个静态路径,它就可以正常工作。

{
  path: 'user',
  children: [
    {
      path: ':username',
      component: UserBaseComponent,
      children: [
        {
          path: '',
          component: UserDetailsComponent,
        },
        {
          path: 'progress',
          component: ProgressComponent,
        },
        {
          path: 'timeline',
          component: TimelineComponent,
        },
        {
          path: 'leaderboard',
          component: LeaderboardComponent,
        }
      ],
    }
  ]
}

谁能解释一下为什么?

最佳答案

当您在主模块中导入具有自己路由的模块时,子模块的路由将放置在主路由之前。

所以当您导入 UserModule 时,您的路由看起来像这样。

- :username
    - /
    - progress

- login

当读取路由时,它从顶部开始,所以首先读取 :username。该路由匹配所有内容,因此不会访问其他路由。

您可以尝试延迟加载您的用户模块,这样您就可以控制路由的顺序。请注意,您不再将 UserModule 声明为导入。

const routes: Routes = [
  {
    path: 'login',
    component: LoginComponent
  },
  {
    path: '',
    loadChildren: '<PATH_TO_MODULE>/user.module#UserModule'
  },
];

imports: [
    RouterModule.forRoot(routes)
]

这是一个 Stackblitz:https://stackblitz.com/edit/ng-stackoverflow-52391592

关于javascript - Angular 2+ |如何在 NgModule 中使用参数定义路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52391592/

相关文章:

angular - 如何在 Angular 6 中创建一个完全动态的按钮?

JavaScript 导入不起作用

angular - 完成for循环后如何完成订阅者?

javascript - 保持网站高度

Angular 测试点击事件

HTML + CSS 在 mat-icon 的中心对齐上失败

typescript - 动态过滤 rxjs 流

css - 在 Angular 7 中启用滚动

javascript - 子组件不渲染

javascript - Busboy不会收到上传的文件