【问题标题】:Angular 7, named router outlet doesn't work inside lazy loaded moduleAngular 7,命名路由器插座在延迟加载的模块中不起作用
【发布时间】:2019-04-03 02:33:41
【问题描述】:

所以我遇到了著名的角度路由问题"named outlet with lazy loaded module"。这个问题似乎已经关闭,this guy provided a plunker 使用了我一直在关注的工作解决方案。但是我仍然收到错误并且无法理解此问题的性质

错误:无法匹配任何路由。网址段:

我尝试使用 pathMatch: 'full' 与不同的重定向路由到不同的组件,但最后总是得到相同的错误。

我已经被困了几个小时,这就是为什么决定在这里提问。我的问题在哪里,我错过了什么?

我的设置

app.routing.ts:

 const routes: Routes = [
      {
        path: '',
        loadChildren: 'app/home/home.module#HomeModule',
      },
      {
        path: 'admin',
        loadChildren: 'app/admin/admin.module#AdminModule',
      },
      {
        path: 'data',
        loadChildren: 'app/data/data.module#DataModule',
      },
      {
        path: '**',
        redirectTo: ''
      }
    ];

app.component.html

<app-header></app-header>
<router-outlet></router-outlet>

data.routing-module.ts

    const routes: Routes = [
  {
    path: 'summary',
    component: SummaryComponent,
    canActivate: [AuthGuard],
  },
  {
    path: 'management/:id',
    component: DataComponent,
    canActivate: [AuthGuard],
    children: [
      {
        path: 'activities',
        component: ActivitiesComponent,
        outlet: 'activities',
      },
      {
        path: 'researches',
        component: ResearchesComponent,
        outlet: 'researches',
      }
    ]
  },
  {
    path: 'review/:id',
    component: InfoComponent,
    canActivate: [AuthGuard],
  },
];

data.component.html

<mat-drawer-container class="docs-viewer-container">

  <mat-drawer position='start' [mode]='mode'>
    <router-outlet name="activities"></router-outlet>
  </mat-drawer>

  <mat-drawer position='end' [mode]='mode'>
    <router-outlet name="researches"></router-outlet>
  </mat-drawer>

  <mat-drawer-content>
    ... 
     // content
    ...
  </mat-drawer-content>

</mat-drawer-container>

因此,在用户单击链接导航 url 路由后,数据模块的登录页面是摘要组件,如下所示:'path/data/summary?params'。 Summary.component 有导航功能

  onActivitySelection(event) {

    this.queryParams.offset = 0;
    this.queryParams.limit = 25

    this.router.navigate([{
        outlets: {
          'activities': '/data/management/' + event.id + '/activities'
        }
      }],
      {
        queryParams: this.queryParams
      })
  }

如您所见,重定向路由必须是“/data/management/:id/activities”。但是错误说找不到这条路线。

那么有人可以帮我解决我的问题吗?

【问题讨论】:

    标签: angular typescript angular-routing


    【解决方案1】:

    尝试将模块的路由包含在索引组件中。您有一个用于应用模块的路由器插座,但没有任何低于它的级别。

    对于数据模块的路由:

    {
        path: '', component: DataIndexComponent, canActivate: [AuthGuard],
        children: [
          {
           path: 'summary',
           component: SummaryComponent
          },
          ...[restOfRoutes]
          ]
    }
    

    在 DataIndexComponent 中添加 &lt;router-outlet&gt;&lt;/router-outlet&gt;

    另一方面,如果您使用相同的身份验证保护,则可以将其放在模块的索引级别。

    【讨论】:

    • 就在您发表评论之前,我尝试应用类似的解决方案,并且效果很好。 IndexComponent.html: &lt;router-outlet&gt;&lt;/router-outlet&gt; &lt;router-outlet name="activities"&gt;&lt;/router-outlet&gt; 因此,如果我手动提供 url 角度会将我重定向到必要的路线,但如果我尝试使用函数 onActivitySelection(event) 导航,它将无法正常工作。那里似乎有什么问题......
    • 我个人不会将路由器插座放在主插座下面,因为您的意思是根据 URL 树在“数据”之后附加其余路由,没有子路由器- 与 App 路由器插座相邻的插座。试试this.router.navigate([`/data/management/${eventId}/activities`])。 (附注:如果您不打算在子路由下添加子路由,我认为没有必要明确命名子路由的出口。)
    • ...或者如果您遵循路由器插座的嵌套模式。
    • 我将名称 outlet 替换为子组件,因为它看起来正确,但 this.router.navigate([/data/management/${eventId}/activities])
    • 我认为您没有完成评论。看来您没有在数组中的参数中添加反引号。给我看看替代品,或者你可以把它放在 Stackblitz 中。
    猜你喜欢
    • 2019-01-05
    • 1970-01-01
    • 2017-02-28
    • 2022-07-21
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多