【问题标题】:Angular routing confusion/strange behavior角度路由混淆/奇怪的行为
【发布时间】:2020-12-10 13:55:33
【问题描述】:

我有一个包含三个同级路由的基本路由。父路由路由到我的 task-list.component.ts,其中包含导航栏和路由器出口。

我想在基本路由上有一个路由参数,我可以在其中添加一个可选令牌

所以当我导航到 http://localhost:4200 时,令牌应该是未定义的。

当我导航到 http://localhost:4200/123 时,激活的路由参数中的令牌应该是 123

我有以下路线配置,但我遇到了令人困惑/奇怪的行为。

当我导航到 http://localhost:4200 时,我按预期到达了我的基本 taskList.component。

当我尝试导航到 http://localhost:4200/123 时,我得到一个 404 未找到?预期的行为是它应该导航到 taskList.component 并将 123 添加到激活的路由参数中......

更奇怪的是,当我单击导航栏中已删除的链接时,它会再次导航到父组件 app.component,然后我才被“删除”作为激活的路由参数中的值...

更奇怪的是:当我使用浏览器导航到 http://localhost:4200 时,它并没有将已删除设置为令牌,而是再次出现 404 未找到...

知道如何实现上述目标/我的问题可能是什么?

我的路由模块代码:

    import { NgModule } from '@angular/core';
    import { Routes, RouterModule } from '@angular/router';
    
    import { AppComponent } from './app.component';
    import { TaskListComponent } from './task/task-list/task-list.component';
    import { CompletedTasksComponent } from './task/completed-tasks/completed-tasks.component';
    import { DeletedTasksComponent } from './task/deleted-tasks/deleted-tasks.component';
    
    
const routes: Routes = [  
  { path: '', component: TaskListComponent, pathMatch: 'full' },
  { path: 'completed', component: CompletedTasksComponent },
  { path: 'deleted', component: DeletedTasksComponent },
  { path: ':token', component: TaskListComponent },  
  { path: ':token/completed', component: CompletedTasksComponent },
  { path: ':token/deleted', component: DeletedTasksComponent }
];
    
    @NgModule({
      imports: [RouterModule.forRoot(routes)],
      exports: [RouterModule]
    })
    export class AppRoutingModule { }

app.component.html:

<nav mat-tab-nav-bar>
    <a mat-tab-link
    *ngFor="let link of links"
    [routerLink]="navigate(link)"
    (click)="activeLink = link"
    [active]="activeLink == link">{{link}}</a>
    

    </nav>


<router-outlet></router-outlet>

app.component.ts 导航方法

navigate(link) {
    switch(link) {
      case 'Task List':
        return `${this.token}`;
      case 'Completed Tasks':
        return `${this.token}/completed`;
      case 'Deleted Tasks':
        return `${this.token}/deleted`;
    }
  }

【问题讨论】:

  • 所以在令牌中您的意思是来自登录/其他形式的身份验证的后端令牌?
  • @Jack M 现在我只想将任何测试值作为参数添加到根,例如localhost:4200/testToken 在路由参数中应该有值 testToken。
  • 我不确定我是否理解您的问题:这里的有效路由是 localhost:4200/token 和 token/completed 和 token/deleted 那些应该显示其组件的内容。这没有发生吗?
  • @Jack M 不,我想为这些路由添加一个路由参数并解析路由中的参数,例如如果我的令牌是 123 并且路由定义是 :token/ 当我向 localhost:4200/123 发出请求时, route.params 中的令牌值必须是 123
  • 好吧,如果 1234blabla 是某个地方的 id,那么您需要将 :token 替换为 /:id 我不知道这是否可行,尽管我只有在我们有 'token/:/ 时才这样做id'

标签: javascript angular types angular-routing


【解决方案1】:

旧答案:您的路线存在一些问题。你可以像这样修复它:

    RouterModule.forRoot([
      { path: "", component: TaskListComponent, pathMatch: "full" },
      { path: "deleted", component: DeletedTasksComponent },
      { path: ":id", component: TaskListComponent },
      { path: ":id/completed", component: CompletedTasksComponent },
      { path: ":id/deleted", component: DeletedTasksComponent }
    ])

Run It On Stackblitz

更新: 根据您的编辑和 cmets,现在在应用程序导航中有效,但是当您刷新页面时(即使在开发环境中)您会得到 404。所以试试这个:https://stackoverflow.com/a/35285068/4718434。 (同样在生产环境中,您应该将服务器配置为在每个路径上返回 Angular html 文件。)

【讨论】:

  • 当我点击 localhost:4200/123 时,我仍然希望能够解析 id(路由参数中的 id 应该是 123)但是我得到一个 404 not found...任何想法我怎样才能做到这一点?
  • 我用更详细的问题描述更新了问题...
  • @user2094257 您的问题中有一个错误。 AppComponent 是应用程序的主要组件,它包含router-outlet。所以你不应该在你的路线中使用。您应该创建一个单独的组件,如app-main-component 以在路由中用作主路由,因此它将被放置在router-outlet 中。为简单起见,请暂时删除children 并使用简单的路由,因为您似乎对角度路由系统不够熟悉,它只会让事情变得复杂。更新了答案。
  • 唯一的问题是如果主组件位于 内,我如何重新使用我的导航栏/跟踪导航栏中哪个路由处于活动状态而不将导航栏复制到已删除和完成的组件?
  • @user2094257 how could I re-use my navbar? -> way1。只需创建一个名为 navbar 的组件并在多个页面中使用它。方式2。在应用程序组件中在router-outlet 之外编写导航栏。 ||| how can i keep track of which route is active -> 使用&lt;a ... routerLinkActive="active" &gt;,它为活动链接添加了一个css。
猜你喜欢
  • 2022-07-12
  • 2014-10-23
  • 2017-09-01
  • 2016-09-25
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多