【问题标题】:How to navigate to a child route by default - Angular 7 (Routes)默认情况下如何导航到子路由 - Angular 7 (Routes)
【发布时间】:2019-10-02 14:02:25
【问题描述】:

我正在使用 Angular 路由来浏览组件。当用户登录时,他们会导航到dashboard/:id,然后他们会看到dashboard/123/projects 等。问题是,当用户仅导航到/dashboard 时,我想默认将他们重定向到/dashboard/:id。但是当我这样做时:{ path:"dashboard", redirectTo:"dashboard/:id/projects", pathMatch:"full"} 它通过一个错误说:id 未定义,我无法从/dashboard 导航到当前登录/dashboard/123/projects 的用户。

我的 Routes.modules.ts 代码

const routes: Routes = [{
    path: "",
    redirectTo: "/login",
    pathMatch: "full"
  },
  {
    path: "login",
    component: LoginComponent
  },
  {
    path: "register",
    component: RegisterComponent
  },
  //the problem goes here
  {
    path: "dashboard",
    redirectTo: "", //How to redirect to dashboard/:id ?
    pathMatch: "full"
  },
  {
    path: "dashboard/:id",
    component: DashboardComponent,
    children: [{
        path: "",
        redirectTo: "projects",
        pathMatch: "full"
      },
      {
        path: "projects",
        component: ProjectsComponent
      },
      {
        path: "archived",
        component: ArchivedProjectsComponent
      },
      {
        path: "projects/:id",
        component: SingleProjectComponent,
        children: [{
            path: "",
            redirectTo: "plans",
            pathMatch: "full"
          },
          {
            path: "plans",
            component: PlansComponent
          },
          {
            path: "tasks",
            component: TasksComponent
          },
          {
            path: "photos",
            component: PhotosComponent
          },
          {
            path: "files",
            component: FilesComponent
          },
          {
            path: "people",
            component: PeopleComponent
          },
          {
            path: "settings",
            component: SettingsComponent
          },
          {
            path: "trash",
            component: TrashComponent
          },
          {
            path: "**",
            redirectTo: "plans",
            pathMatch: "full"
          }
        ]
      },
      {
        path: "**",
        redirectTo: "projects",
        pathMatch: "full"
      }
    ]
  },
  {
    path: "**",
    component: PageNotFoundComponent
  },
];

【问题讨论】:

    标签: angular angular6 angular7 angular7-router


    【解决方案1】:

    您可以使用登录组件来实现此目的。成功登录后将用户重定向到子路由。

    根据您的结构,从有效负载或您的 API 调用中获取用户的 id,并将其传递给路由。

    this.router.navigate(['/dashboard/' + id + '/projects']);
    

    this.routerRouter 的一个实例。

    【讨论】:

    • 所以这意味着,它只能以编程方式实现,而不是使用配置?
    • @NadeemAhmad 我的理解是id 在这种情况下不可用。
    【解决方案2】:

    我认为您需要将“:id”的值存储在请求之间的本地存储中,即存储最后一个“id”。

    在您的重定向中提供一个任意值,然后在您的DashboardComponent 中捕获它。查找 9999(或其他),然后替换本地存储中的值。

      ngOnInit() {
    localStorage.getItem('id'))
      }
    
    {
        path: "dashboard",
        redirectTo: "dashboard/99999", //How to redirect to dashboard/:id ?
        pathMatch: "full"
      }
    

    【讨论】:

    • 我知道了,所以当用户登录时,它将使用仪表板组件中的代码完成。
    • 如果我理解您的问题,我想是的。基本上,您希望能够使用参数重定向到路由,但用户不提供它只是输入“/dashboard”,因此您需要从之前的请求中获取之前的路由ID,他们确实提供了“ ID”。如果没有提供任何值,那么您也需要捕获它。只是一个想法。还需要考虑从本地存储中删除 id(必要时过期)。
    • 完美,我现在抓住你了!
    • 或者只是将值存储在服务单例中的变量中。这样当用户退出浏览器时它就会消失。我猜取决于您的缓存要求。但同样的原则也适用。您需要仅在会话期间将最后一个 id 存储在某个地方或更永久地存储,例如本地存储。
    • 啊...我没有意识到“id”是您的用户 ID。在这种情况下,您可以从您的 JWT 令牌或您存储用户 ID 的任何其他位置获取此信息。与上述相同的主体,但您需要将 ID 保存在某处以便在会话后登录期间检索。祝您好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2016-12-05
    • 2019-10-27
    • 2023-02-06
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多