Angular 7, именованная розетка маршрутизатора не работает внутри лениво загруженного модуля - PullRequest
1 голос
/ 02 апреля 2019

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

Ошибка: невозможно сопоставить ни один маршрут. Сегмент 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'. 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 / activity». Но ошибка говорит о том, что этот маршрут нельзя найти.

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

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

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

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

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

В компоненте DataIndexComponent добавьте <router-outlet></router-outlet>.

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

0 голосов
/ 02 апреля 2019

Вот рабочее решение

data.routing-module.ts:

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

view.component.html

<router-outlet></router-outlet>

data.component.html

<router-outlet name='activities'></router-outlet>

Улучшена функция навигации в summary.component.ts

 oActivitySelection(event) {

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

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

и, наконец, URL выглядит следующим образом: /data/management/272/(panel:activities)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...