Angular: перенаправление с компонента на компонент

#angular #angular-ui-router

#angular #angular-пользовательский интерфейс-маршрутизатор

Вопрос:

В моей попытке изучить маршрутизацию и навигацию angular я наткнулся на эту часть навигации.

Моя структура компонента Angular:

 AppComponent
    -LandingPage
    -WhatEver1
     -Home
     -Price
     -Sales
    -WhatEver2
     -Blog
     -ContactUs
  

Мои маршруты:

 const appRoutes: Routes = [
  {path: '', component: LandingPageComponent},
  {path: 'whatever-1', component: WhateverComponent},
  {path: 'whatever-2', component: Whatever2Component}
];
  

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

HTML-часть целевой страницы:

 <div class="row">
    <button class="btn btn-primary" (click)="redirectToTravelLife()">Travel Life</button>
    <button class="btn btn-warning" (click)="redirectToSoftwareLife()">Software Life</button>
  </div>

  <div class="row">
    <router-outlet></router-outlet>
  </div>
  

Машинописный код:

 constructor(private router: Router) {}

  redirectToSoftwareLife() {
      this.router.navigateByUrl('/whatever-1');
  }
  redirectToTravelLife() {
      this.router.navigateByUrl('/whatever-2');
  }
  

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

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

1. Как вы настраиваете свой компонент целевой страницы, размещен ли он в другом компоненте, например, в оболочке приложения с выходом маршрутизатора?

2. почему голосование против?

Ответ №1:

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

У вас должен быть отдельный компонент с кнопками (назовем его LandingPageComponent) и 2 отдельных компонента (Whathever1Component и whathever2component).

В вашем модуле маршрутизатора должны быть маршруты, которые выглядят примерно так:

 const routes: Routes = [
    {path: 'landingpage', component: LandingPageComponent},
    {path: 'whatever-1', component: Whatever1Component},
    {path: 'whatever-2', component: Whatever2Component}
];
  

Теперь у вас будет целевая страница без маршрутизатора, поэтому, когда вы нажмете на кнопку, вы будете перенаправлены на WhateverComponent или Whatever2Component, и, конечно, без отображения кнопок!

Надеюсь, это поможет!

Редактировать:

Что касается вашего комментария («Где я должен хранить свою целевую страницу приложения»), это то, что вам нужно иметь: у вашего компонента приложения должен быть маршрутизатор-выход. Внутри этого маршрутизатора-выхода будут отображаться другие части вашего приложения (целевая страница, whatever1, whatever2, …), и вам понадобится структура маршрутов, которую я уже написал. Вам не нужно никуда помещать app-landing-page, вы уже включили его через routes. Таким образом, когда вы переходите к своему маршруту / целевой странице, этот компонент будет отображаться. Пример:

app.component.html:

 <div>
    <router-outlet></router-outlet>
</div>
  

app-routing.module.ts:

 ...
const routes: Routes = [
    {path: '', redirectTo: 'landingpage', pathMatch: 'full'},
    {path: 'landingpage', component: LandingPageComponent},
    {path: 'whatever-1', component: Whatever1Component,
    children: [
        { path: '', redirectTo: 'home', pathMatch: 'full' },
        { path: 'home', component: HomeComponent},
        { path: 'price', component: PriceComponent },
        { path: 'sales', component: SalesComponent }
    ]},
    {path: 'whatever-2', component: Whatever2Component,
    children: [
        { path: '', redirectTo: 'blog', pathMatch: 'full' },
        { path: 'blog', component: BlogComponent},
        { path: 'contactus', component: ContactComponent }
    ]}
   ];
...
  

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

1. итак, у меня есть сомнения. где я должен хранить свою <целевую страницу приложения></app-landing-page>

2. Спасибо за подробное объяснение.

Ответ №2:

Привет, шрирам, в соответствии со структурой вашего компонента вы хотите перенаправить с родительского компонента на дочерний компонент. Согласно вашей структуре компонента

 -LandingPage
-WhatEver1
 -Home
 -Price
 -Sales
-WhatEver2
 -Blog
 -ContactUs
  

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

 export const routes: Routes = [
  { path: '', redirectTo: 'LandingPage', pathMatch: 'full' },
  { path: 'LandingPage', component: LandingPageComponent },
  { path: 'WhatEver1', component: WhatEver1Component,
  children: [
     { path: '', redirectTo: 'Home', pathMatch: 'full' },
     { path: 'Home', component: HomeComponent},
     { path: 'Price', component: PriceComponent },
     { path: 'Sales', component: SalesComponent }
  ]
 }
];
  

Ответ №3:

При навигации с помощью navigateByUrl он заменяет содержимое в <router-outlet></router-outlet> целевым компонентом.

Чтобы выполнить вашу задачу, вам нужно разделить кнопки на другой компонент (возможно, что-то вроде NavComponent ).

  const appRoutes: Routes = [
  {path: '', redirectTo: 'nav', pathMatch: 'full'},
  {path: 'nav', component: NavComponent},
  {path: 'whatever-1', component: WhateverComponent},
  {path: 'whatever-2', component: Whatever2Component}
];
  

Вышеуказанные маршруты будут перенаправляться / на /nav . Таким образом, кнопки всегда будут отображаться как целевая страница.

HTH.