Угловой 6 - Как мне установить родительский пункт меню в активный, используя routerLinkActive, если щелкнуть его дочерний пункт меню?
Я использую Angular 6, и я столкнулся с проблемой, связанной с моим меню навигации.
Когда я нажимаю на дочерний элемент, активным становится только дочерний элемент, а не родительский при использовании routerLinkActive.
Мне интересно, как я мог установить родительский элемент класса активным при выборе его дочернего элемента в Angular 6?
Допустим, я нажимаю кнопку "Обслуживание полов", которая является дочерней компанией Служб Только Обслуживание Пола будет установлено активным, но не Сервисами. Я бы хотел, чтобы кнопка "Службы" была активна с помощью routerLinkActive при нажатии на любой из ее дочерних элементов.
Меню навигации
<nav class="navbar navbar-expand-lg navbar-light bg-white thick-border-bottom">
<div class="container">
<a class="navbar-brand" routerLink=""><img id="logo" class="img-fluid" src="./assets/logo.svg" alt=""></a>
<button class="navbar-toggler my-3" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" routerLink="" routerLinkActive="active" [routerLinkActiveOptions]={exact:true}>Home<span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="/about" routerLinkActive="active">About</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" routerLink="services" routerLinkActive="active" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
Services
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" routerLink="services/janitorial-services" routerLinkActive="active">Janitorial Services</a>
<a class="dropdown-item" routerLink="services/floor-maintenance" routerLinkActive="active">Floor Maintenance</a>
<a class="dropdown-item" routerLink="services/green-cleaning-services" routerLinkActive="active">Green Cleaning</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="/our-difference" routerLinkActive="active">Our Difference</a>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="/our-clients" routerLinkActive="active">Our Clients</a>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="/contact" routerLinkActive="active">Contact</a>
</li>
</ul>
</div>
</div>
</nav>
Модуль маршрутизации
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AboutComponent } from './frontend/pages/about/about.component';
import { HomeComponent } from './frontend/pages/home/home.component';
import { ServicesComponent } from './frontend/pages/services/services.component';
import { JanitorialServicesComponent } from './frontend/pages/services/subpages/janitorial-services/janitorial-services.component';
import { ServiceAreasComponent } from './frontend/pages/service-areas/service-areas.component';
import { OurClientsComponent } from './frontend/pages/our-clients/our-clients.component';
import { ContactComponent } from './frontend/pages/contact/contact.component';
import { FloorMaintenanceComponent } from './frontend/pages/services/subpages/floor-maintenance/floor-maintenance.component';
import { GreenCleaningServicesComponent } from './frontend/pages/services/subpages/green-cleaning-services/green-cleaning-services.component';
import { OurDifferenceComponent } from './frontend/pages/our-difference/our-difference.component';
const routes: Routes = [
{ path: '', redirectTo: '/', pathMatch: 'full' },
{ path: '', component: HomeComponent },
{ path: 'about', component: AboutComponent },
{ path: 'services', component: ServicesComponent,
children: [
{path: "janitorial-services", component: JanitorialServicesComponent},
{ path: "green-cleaning-services", component: GreenCleaningServicesComponent},
{ path: "floor-maintenance", component: FloorMaintenanceComponent}
]
},
{ path: 'our-difference', component: OurDifferenceComponent },
{ path: 'our-clients', component: OurClientsComponent },
{ path: 'contact', component: ContactComponent }
];
@NgModule({
exports: [RouterModule],
imports: [RouterModule.forRoot(routes)],
})
export class AppRoutingModule { }
2 ответа
Поэтому, когда я сравнил свой код с https://stackblitz.com/edit/parent-child-active?file=src%2Fapp%2Fapp.component.css это.
Единственное отличие, которое я смог найти, заключается в том, что атрибуты routerLinks и routerLinkActive, которые я установил для тегов a.
Поэтому я решил структурировать это так:
<ul>
<li routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
<a href="#" routerLink="/">Home</a>
</li>
<li routerLinkActive="active">
<a href="#" routerLink="/parent">Parent Component</a>
<ul>
<li routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">
<a href="#" routerLink="/parent/child">Child Component</a>
</li>
</ul>
</li>
</ul>
Если вы хотите, чтобы родительский класс оставался активным, в то время как дочерний класс тоже, вам нужно установить routerLink для дочернего элемента как /parent/child. Если начало активного routerLink соответствует точно другому, оба станут активными:
<div>
<a routerLink="/Parent" routerLinkActive="active">Parent</a>
<a routerLink="/Parent/Child" routerLinkActive="active">Child</a>
</div>
Вы можете добиться этого с помощью переменной шаблона. Проверить#rla
переменная в дочернем компоненте.
<li [ngClass]="{ 'is-expanded': rla.isActive }">
<a>Parent</a>
<ul>
<li>
<a routerLink="/child" routerLinkActive="active" #rla="routerLinkActive">Child</a>
</li>
</ul>
</li>