Angular 7, именованная розетка маршрутизатора, не работает внутри лениво загруженного модуля

#angular #typescript #angular-routing

#angular #typescript #angular-маршрутизация

Вопрос:

Итак, я столкнулся с известной проблемой маршрутизации angular «именованная розетка с лениво загруженным модулем». Похоже, что эта проблема закрыта, и этот парень предоставил plunker с рабочим решением, которому я следил. Однако я все еще получаю сообщение об ошибке и не могу понять природу этой проблемы

Ошибка: не удается сопоставить какие-либо маршруты. Сегмент URL:

Я пытался использовать 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' . Резюме. компонент имеет функцию навигации

   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’. Но ошибка говорит о том, что этот маршрут не может быть найден.

Итак, кто-нибудь может помочь мне с моей проблемой?

Ответ №1:

Попробуйте разместить маршруты модуля в компоненте индекса. У вас есть маршрутизатор-выход для модуля приложения, но не для любого из нижележащих уровней.

Для маршрутов модуля данных:

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

В DataIndexComponent add <router-outlet></router-outlet> .

С другой стороны, если вы используете ту же защиту аутентификации, вы можете поместить ее на уровень индекса модуля.

Комментарии:

1. Непосредственно перед вашим комментарием я попытался применить аналогичное решение, и оно работает частично. IndexComponent.html : <router-outlet></router-outlet> <router-outlet name="activities"></router-outlet> Поэтому, если я вручную укажу URL, angular перенаправит меня на необходимый маршрут, но он не работает, если я попытаюсь перейти с помощью функции onActivitySelection(event) . Кажется, что-то не так…

2. Я лично не стал бы размещать router-outlet под основным, поскольку вы хотите добавить остальные маршруты после ‘data’ в соответствии с деревом URL, не имея дочернего router-outlet рядом с App router-outlet. Попробуйте this.router.navigate([`/data/management/${eventId}/activities`]) . (PS Я не думаю, что есть необходимость явно указывать выходы дочерних маршрутов, если вы не собираетесь добавлять дочерние элементы под ним.)

3. … или, если вы будете следовать шаблону вложенности выходов маршрутизатора.

4. Я заменил имя розетки на дочерний компонент, потому что это кажется правильным, но this.router.navigate([ /data /management/${EventID}/activities ])

5. Я не думаю, что вы закончили свой комментарий. Похоже, вы не добавили обратные пометки к аргументу в массиве. Покажите мне замену или вы можете поместить ее в Stackblitz.