Некорректное функционирование маршрутов в Angular

При попытке перейти от «пользователей» к «пользователям /: id», как это

this.router.navigate([`/users/${userId}`]);

или

this.router.navigate(['/users', userId]);

он остается на «пользователях», но URL-адрес в панели браузера меняется на «users/{correct_id}»

Структура приложения:

  • панель приборов (/)
  • логин (/логин)
  • пользователи (/пользователи)
    • пользователи/идентификатор (/пользователи:идентификатор)

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

приложение-routing.module.ts:

const routes: Routes = [
{
    path: '',
    component: DashboardComponent,
    loadChildren: (): Promise<DashboardModule> =>
        import('./dashboard/dashboard.module').then(
            (m: typeof import('./dashboard/dashboard.module')): DashboardModule => m.DashboardModule
        )
},
{
    path: 'login',
    component: LoginComponent,
    loadChildren: (): Promise<LoginModule> =>
        import('./login/login.module').then(
            (m: typeof import('./login/login.module')): LoginModule => m.LoginModule
        )
},
{
    path: 'users',
    component: UsersComponent,
    loadChildren: (): Promise<LoginModule> =>
        import('./users/users.module').then(
            (m: typeof import('./users/users.module')): UsersModule => m.UsersModule
        )
},
{
    path: '**',
    redirectTo: ''
}

];

пользователи-routing.module.ts:

const routes: Routes = [
{
    path: '',
    component: UsersComponent,
},
{
    path: ':id',
    component: UserProfileComponent,
},

];

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
28
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

в вашей первой попытке,

this.router.navigate([`${userId}`]);

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

со второй попытки,

this.router.navigate([`${users/userId}`]);

у вас есть несколько вопросов:

  1. не начиная навигацию с помощью '/' маршрутизатор думает, что вы пытаетесь перейти к текущему маршруту, что не так.

  2. ваш шаблон строки маршрута неверен (вы пытаетесь использовать переменную users/userId, что явно не то, что вы имели в виду), вы должны изменить его на:

    this.router.navigate(['/users', ${userId}]);

Спасибо, что указали на проблемы, к сожалению, после их исправления проблема не исчезла, но, несмотря на изменение URL-адреса на правильный вид, он не появляется.

TalVik99 14.05.2022 10:33

Вы должны удалить настройку компонента в массиве routes.

const routes: Routes = [
    ...
    {
        path: 'users',
        // component: UsersComponent,                << remove this line
        loadChildren: (): Promise<LoginModule> =>
            import('./users/users.module').then(
                (m: typeof import('./users/users.module')): UsersModule => m.UsersModule
            )
    },
    ...
];
Ответ принят как подходящий

Проблема, вероятно, в следующем маршруте:

{
  path: 'users',
  component: UsersComponent, // <-- HERE
  loadChildren: (): Promise<LoginModule> =>
    import('./users/users.module').then(
      (m: typeof import('./users/users.module')): UsersModule => m.UsersModule)
},

Когда вы назначаете компонент маршруту, когда этот маршрут совпадает, этот компонент всегда будет отображаться. И если у него есть дети, они будут отображаться в <router-outlet> этого UserComponent шаблона.

Поскольку у вас также есть UserComponent назначение корневого пути дочерних элементов, я думаю, это не так.

Чтобы решить эту проблему, вам просто нужно удалить строку компонента из маршрута 'users'.

{
  path: 'users',
  loadChildren: (): Promise<LoginModule> =>
    import('./users/users.module').then(
      (m: typeof import('./users/users.module')): UsersModule => m.UsersModule)
},

Ваше здоровье

Спасибо за разъяснение и решение! Действительно, достаточно было удалить эту строку, и навигация заработала корректно.

TalVik99 14.05.2022 13:54

Есть две проблемы,

1-й — вы использовали функцию ленивой загрузки, поэтому вам не нужно загружать компонент в основной маршрут.

{
    path: 'users',
    component: UsersComponent, // <-- REMOVE it
    loadChildren: (): Promise<LoginModule> =>
        import('./users/users.module').then(
            (m: typeof import('./users/users.module')): UsersModule => m.UsersModule
        )
},

2-й - тогда вам также нужно изменить маршрут пользовательского модуля, например,

пользователи-routing.module.ts:

const routes: Routes = [{
  path: '',
  children: [{
    path: '',
    component: UsersComponent,
  }, {
    path: ':id',
    component: UserProfileComponent
  }]
}];

Надеюсь, вы разобрались с этим решением

Другие вопросы по теме