【问题标题】:Angular2+ | How to define routing with params in NgModule角2+ |如何在 NgModule 中使用参数定义路由
【发布时间】:2018-09-18 17:13:22
【问题描述】:

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

app.module.ts

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

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

user.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,
        }
      ],
    }
  ]
}

谁能解释一下原因?

【问题讨论】:

  • 如果有回答了您的问题的答案,请将其标记为答案。
  • 好的,谢谢鲁本。

标签: javascript angular typescript


【解决方案1】:

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

因此,当您导入 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

【讨论】:

    【解决方案2】:

    您的user.module 也可以使用。但如果您的网址是这样的,它会起作用:https:\\www.google.com\2

    path: ':username',
    component: UserBaseComponent,
    children: [
         {
            path: '',
            component: UserDetailsComponent,
          },
    ]
    

    以下代码与https:\\www.google.com\user\2一起使用。

    path: 'user',
    children: [
        {
          path: ':username',
          component: UserBaseComponent,
          children: [
              {
                path: '',
                component: UserDetailsComponent,
              },
         }
    ]
    

    user.module 的第二个代码中,您没有定义任何组件,只是定义了它的子组件。因此,当您运行您的子组件时,它将作为 sibling 而不是 children 组件运行。

    因为如果要在父组件内运行子组件,则必须在父组件内定义更多&lt;router-outlet&gt;

    创建应用程序时,app.component.html 内的角度默认为&lt;router-outlet&gt;

    这是带有父子和参数的工作Stackblitz。您可以根据需要进行修改。

    【讨论】:

      【解决方案3】:

      当您将您的用户名路径声明为“:username”时,它会将根 url 中的任何给定字符串作为您的 UserBaseComponent 的有效参数。这就是您的“登录”字符串被定向到 UserBaseComponent 的原因。

      例如,您的网址是:'jam.com'。

      'jam.com/:username' 使任何 'jam.com/xxxxxx' 成为 UserBaseComponent 的有效参数 - 包括 'jam.com/login'。

      您已经解决了这个问题 - 通过在参数之前创建一个静态路径来明确区分它与 /login。

      【讨论】:

      • 我不知道它在官方文档中的位置,但是“非参数化路由优先于参数化路由。”。 :D
      • 没错,但是您的非参数路由和参数路由位于不同的模块中,所以我不确定这会如何影响事情。把静态路由留在里面有问题吗?
      • 在不同的模块中声明应该是原因,我很想知道为什么。我无法插入静态路径,我认为这不是正确的解决方案。 :'(
      • 合并成一个路由模块怎么样?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      相关资源
      最近更新 更多