W Angular, jak określić trasę aktywną?
Uwaga: istnieje wiele różnych odpowiedzi tutaj, i większość z nich były ważne w tym czy innym czasie. Faktem jest, że to, co działa, zmieniło się wiele razy, gdy zespół Angular zmieniał swój Router. Wersja routera 3.0, która ostatecznie będzie routerem w kątowych przerwach wiele z tych rozwiązań, ale oferuje bardzo proste rozwiązanie własne. Od RC.3, preferowanym rozwiązaniem jest użycie [routerLinkActive]
, Jak pokazano w tej odpowiedzi .
In an Angular aplikacji (aktualne w wersji 2.0.0-beta.0 release jak to piszę), jak określić, jaka jest aktualnie aktywna trasa?
Pracuję nad aplikacją, która używa Bootstrap 4 i potrzebuję sposobu, aby oznaczyć linki/przyciski nawigacyjne jako aktywne, gdy ich powiązany komponent jest wyświetlany w znaczniku <router-output>
.
Zdaję sobie sprawę, że sam mogę utrzymać stan po kliknięciu jednego z przycisków, ale to nie obejmowałoby przypadku posiadania wielu ścieżek do tej samej trasy (powiedzmy głównej menu nawigacyjne oraz menu lokalne w głównym komponencie).
Wszelkie sugestie lub linki będą mile widziane. Dzięki.
25 answers
Dzięki nowemu routerowi kątowemu możesz dodać atrybut [routerLinkActive]="['your-class-name']"
do wszystkich linków:
<a [routerLink]="['/home']" [routerLinkActive]="['is-active']">Home</a>
Lub uproszczony format nie-tablicy, jeśli potrzebna jest tylko jedna klasa:
<a [routerLink]="['/home']" [routerLinkActive]="'is-active'">Home</a>
Zobacz słabo udokumentowanarouterLinkActive
dyrektywa aby uzyskać więcej informacji. (Głównie domyśliłem się tego metodą prób i błędów.)
Aktualizacja: lepszą dokumentację dyrektywy routerLinkActive
można teraz znaleźć tutaj . (Podziękowania dla @ Victor Hugo Arango A. w komentarzach poniżej.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-24 16:25:35
Odpowiedziałem na to w innym pytaniu, ale sądzę, że może to być istotne również dla tego. Oto link do oryginalnej odpowiedzi: kąt 2: Jak wyznaczyć trasę aktywną z parametrami?
Próbowałem ustawić klasę active bez konieczności dokładnego określania bieżącej lokalizacji (używając nazwy trasy). Do tej pory najlepszym rozwiązaniem jest użycie funkcji isRouteActive dostępnej w Router
klasy.
router.isRouteActive(instruction): Boolean
pobiera jeden parametr, którym jest obiekt route Instruction
i zwraca true
lub false
czy ta instrukcja jest prawdziwa czy nie dla bieżącej trasy. Możesz wygenerować trasę Instruction
używając Router
'S generate(linkParams: Array). LinkParams ma dokładnie taki sam format jak wartość przekazywana do dyrektywy routerLink (np. router.isRouteActive(router.generate(['/User', { user: user.id }]))
).
Tak może wyglądać RouteConfig (trochę go podkręciłem, aby pokazać użycie params):
@RouteConfig([
{ path: '/', component: HomePage, name: 'Home' },
{ path: '/signin', component: SignInPage, name: 'SignIn' },
{ path: '/profile/:username/feed', component: FeedPage, name: 'ProfileFeed' },
])
I widok wyglądałby tak:
<li [class.active]="router.isRouteActive(router.generate(['/Home']))">
<a [routerLink]="['/Home']">Home</a>
</li>
<li [class.active]="router.isRouteActive(router.generate(['/SignIn']))">
<a [routerLink]="['/SignIn']">Sign In</a>
</li>
<li [class.active]="router.isRouteActive(router.generate(['/ProfileFeed', { username: user.username }]))">
<a [routerLink]="['/ProfileFeed', { username: user.username }]">Feed</a>
</li>
To było moje preferowane rozwiązanie problemu do tej pory, to może być pomocne dla Ciebie, jak również.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:36
Rozwiązałem problem, który napotkałem w tym linku i dowiedziałem się, że istnieje proste rozwiązanie twojego pytania. Możesz użyć router-link-active
zamiast w swoich stylach.
@Component({
styles: [`.router-link-active { background-color: red; }`]
})
export class NavComponent {
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:36
Mała poprawa dla @ alex-correia-santos odpowiedź na podstawie https://github.com/angular/angular/pull/6407#issuecomment-190179875
import {Router, RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router';
// ...
export class App {
constructor(private router: Router) {
}
// ...
isActive(instruction: any[]): boolean {
return this.router.isRouteActive(this.router.generate(instruction));
}
}
I użyj go tak:
<ul class="nav navbar-nav">
<li [class.active]="isActive(['Home'])">
<a [routerLink]="['Home']">Home</a>
</li>
<li [class.active]="isActive(['About'])">
<a [routerLink]="['About']">About</a>
</li>
</ul>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-07 20:52:37
Możesz sprawdzić bieżącą trasę, wstrzykując obiekt Location
do kontrolera i sprawdzając path()
, w następujący sposób:
class MyController {
constructor(private location:Location) {}
... location.path(); ...
}
Najpierw musisz upewnić się, że zaimportujesz go:
import {Location} from "angular2/router";
Możesz następnie użyć wyrażenia regularnego, aby dopasować ścieżkę do zwróconej ścieżki, aby zobaczyć, która trasa jest aktywna. Zauważ, że klasa Location
zwraca znormalizowaną ścieżkę niezależnie od tego, której LocationStrategy
używasz. Więc nawet jeśli używasz HashLocationStragegy
zwrócone ścieżki nadal będą miały postać /foo/bar
Nie #/foo/bar
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-05 02:55:40
Jak określić, jaka jest aktualnie aktywna trasa?
Aktualizacja: zaktualizowano zgodnie z Angular2. 4.x
constructor(route: ActivatedRoute) {
route.snapshot.params; // active route's params
route.snapshot.data; // active route's resolved data
route.snapshot.component; // active route's component
route.snapshot.queryParams // The query parameters shared by all the routes
}
Zobacz więcej...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-27 10:09:21
Poniżej znajduje się metoda wykorzystująca RouteData do stylizacji elementów paska menu w zależności od bieżącej trasy:
Routeconfig zawiera dane z tabulatorem (bieżąca trasa):
@RouteConfig([
{
path: '/home', name: 'Home', component: HomeComponent,
data: {activeTab: 'home'}, useAsDefault: true
}, {
path: '/jobs', name: 'Jobs', data: {activeTab: 'jobs'},
component: JobsComponent
}
])
A piece of layout:
<li role="presentation" [ngClass]="{active: isActive('home')}">
<a [routerLink]="['Home']">Home</a>
</li>
<li role="presentation" [ngClass]="{active: isActive('jobs')}">
<a [routerLink]="['Jobs']">Jobs</a>
</li>
Klasa:
export class MainMenuComponent {
router: Router;
constructor(data: Router) {
this.router = data;
}
isActive(tab): boolean {
if (this.router.currentInstruction && this.router.currentInstruction.component.routeData) {
return tab == this.router.currentInstruction.component.routeData.data['activeTab'];
}
return false;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 09:07:47
Oto kompletny przykład dodawania active route styling w wersji Angular 2.0.0-rc.1
, która uwzględnia null root paths (np. path: '/'
)
App.komponent.ts - > trasy
import { Component, OnInit } from '@angular/core';
import { Routes, Router, ROUTER_DIRECTIVES } from '@angular/router';
import { LoginPage, AddCandidatePage } from './export';
import {UserService} from './SERVICES/user.service';
@Component({
moduleId: 'app/',
selector: 'my-app',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css'],
providers: [UserService],
directives: [ROUTER_DIRECTIVES]
})
@Routes([
{ path: '/', component: AddCandidatePage },
{ path: 'Login', component: LoginPage }
])
export class AppComponent { //implements OnInit
constructor(private router: Router){}
routeIsActive(routePath: string) {
let currentRoute = this.router.urlTree.firstChild(this.router.urlTree.root);
// e.g. 'Login' or null if route is '/'
let segment = currentRoute == null ? '/' : currentRoute.segment;
return segment == routePath;
}
}
App.komponent.html
<ul>
<li [class.active]="routeIsActive('Login')"><a [routerLink]="['Login']" >Login</a></li>
<li [class.active]="routeIsActive('/')"><a [routerLink]="['/']" >AddCandidate</a></li>
</ul>
<route-outlet></router-outlet>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-11 17:21:47
Rozwiązanie dla Angular2 RC 4:
import {containsTree} from '@angular/router/src/url_tree';
import {Router} from '@angular/router';
export function isRouteActive(router: Router, route: string) {
const currentUrlTree = router.parseUrl(router.url);
const routeUrlTree = router.createUrlTree([route]);
return containsTree(currentUrlTree, routeUrlTree, true);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 12:09:40
Teraz używam rc.4 z bootstrap 4 i ten działa mi idealnie:
<li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact:
true}">
<a class="nav-link" [routerLink]="['']">Home</a>
</li>
To zadziała dla url: / home
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-10 12:28:21
Do oznaczania aktywnych tras routerLinkActive
można użyć
<a [routerLink]="/user" routerLinkActive="some class list">User</a>
Działa to również na innych elementach, takich jak
<div routerLinkActive="some class list">
<a [routerLink]="/user">User</a>
</div>
Jeśli częściowe dopasowania należy również zaznaczyć użycie
routerLinkActive="some class list" [routerLinkActiveOptions]="{ exact: false }"
Z tego co wiem exact: false
będzie domyślnym w RC.4
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:19
Router
w Angular 2 RC nie definiuje już metod isRouteActive
i generate
.
urlTree
- zwraca bieżące drzewo adresów url.
createUrlTree(commands: any[], segment?: RouteSegment)
- stosuje tablicę poleceń do bieżącego drzewa adresów url i tworzy nowe drzewo adresów url.
Spróbuj podążać
<li
[class.active]=
"router.urlTree.contains(router.createUrlTree(['/SignIn', this.routeSegment]))">
zauważ, że routeSegment : RouteSegment
musi być wstrzykiwany do konstruktora komponentu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-27 12:45:02
Instancja klasy routera jest w rzeczywistości obserwowalna i zwraca bieżącą ścieżkę za każdym razem, gdy się zmienia. Tak to robię:
export class AppComponent implements OnInit {
currentUrl : string;
constructor(private _router : Router){
this.currentUrl = ''
}
ngOnInit() {
this._router.subscribe(
currentUrl => this.currentUrl = currentUrl,
error => console.log(error)
);
}
isCurrentRoute(route : string) : boolean {
return this.currentUrl === route;
}
}
A potem w moim HTML:
<a [routerLink]="['Contact']" class="item" [class.active]="isCurrentRoute('contact')">Contact</a>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-15 17:50:21
Inne Obejście. Znacznie łatwiej w Angular Router V3 Alpha. przez iniekcję routera
import {Router} from "@angular/router";
export class AppComponent{
constructor(private router : Router){}
routeIsActive(routePath: string) {
return this.router.url == routePath;
}
}
Użycie
<div *ngIf="routeIsActive('/')"> My content </div>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-25 11:17:28
W Angular2 RC2 możesz użyć tej prostej implementacji
<a [routerLink]="['/dashboard']" routerLinkActive="active">Dashboard</a>
Spowoduje to dodanie klasy active
do elementu z dopasowanym adresem url, przeczytaj więcej o tym tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-10 09:44:43
Poniżej znajdują się odpowiedzi na to pytanie dla wszystkich wersji Angular 2 RC wydanych do dnia dzisiejszego:
RC4 i RC3 :
Do zastosowania klasy do linku lub przodka linku:
<li routerLinkActive="active"><a [routerLink]="['/home']">Home</a></li>
/dom powinien być adresem URL, a nie nazwą trasy, ponieważ właściwość name nie istnieje już w obiekcie Router v3.
Więcej o dyrektywie routerLinkActive pod tym linkiem .
Do stosowania klasy do dowolnego div na podstawie bieżącej trasy :
- wstrzyknąć Router do konstruktora komponentu.
- Router użytkownika.adres URL do porównania.
E. g
<nav [class.transparent]="router.url==('/home')">
</nav>
RC2 i RC1 :
Użyj kombinacji routera.isRouteActive I class.*. np. aby zastosować active class na podstawie trasy głównej.
Nazwa i adres url mogą być przekazywane do routera./ align = "left" /
<li [class.active]="router.isRouteActive(router.generate(['Home']))">
<a [routerLink]="['Home']" >Home</a>
</li>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-15 10:15:27
Użycie routerLinkActive
jest dobre w prostych przypadkach, gdy istnieje link i chcesz zastosować niektóre klasy. Ale w bardziej złożonych przypadkach, gdy może nie masz routerLink lub gdzie potrzebujesz czegoś więcej, możesz utworzyć i użyć rury :
@Pipe({
name: "isRouteActive",
pure: false
})
export class IsRouteActivePipe implements PipeTransform {
constructor(private router: Router,
private activatedRoute: ActivatedRoute) {
}
transform(route: any[], options?: { queryParams?: any[], fragment?: any, exact?: boolean }) {
if (!options) options = {};
if (options.exact === undefined) options.exact = true;
const currentUrlTree = this.router.parseUrl(this.router.url);
const urlTree = this.router.createUrlTree(route, {
relativeTo: this.activatedRoute,
queryParams: options.queryParams,
fragment: options.fragment
});
return containsTree(currentUrlTree, urlTree, options.exact);
}
}
Wtedy:
<div *ngIf="['/some-route'] | isRouteActive">...</div>
I nie zapomnij dodać pipe do zależności rur;)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-16 18:42:04
Jak wspomniano w jednym z komentarzy zaakceptowanej odpowiedzi, dyrektywa routerLinkActive
może być również zastosowana do kontenera rzeczywistego znacznika <a>
.
Więc na przykład z zakładkami Twitter Bootstrap gdzie aktywna klasa powinna być zastosowana do znacznika <li>
zawierającego link:
<ul class="nav nav-tabs">
<li role="presentation" routerLinkActive="active">
<a routerLink="./location">Location</a>
</li>
<li role="presentation" routerLinkActive="active">
<a routerLink="./execution">Execution</a>
</li>
</ul>
Całkiem zgrabne ! Domyślam się, że dyrektywa sprawdza zawartość znacznika i szuka znacznika <a>
z dyrektywą routerLink
.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 15:24:38
W wersji kątowej 4+ nie trzeba używać żadnych skomplikowanych rozwiązań. Możesz po prostu użyć [routerLinkActive]="'is-active'"
.
Dla przykładu z linkiem bootstrap 4 nav:
<ul class="navbar-nav mr-auto">
<li class="nav-item" routerLinkActive="active">
<a class="nav-link" routerLink="/home">Home</a>
</li>
<li class="nav-item" routerLinkActive="active">
<a class="nav-link" routerLink="/about-us">About Us</a>
</li>
<li class="nav-item" routerLinkActive="active">
<a class="nav-link " routerLink="/contact-us">Contact</a>
</li>
</ul>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-12 17:26:49
Pomyślałem, że dodam przykład, który nie używa żadnego maszynopisu:
<input type="hidden" [routerLink]="'home'" routerLinkActive #home="routerLinkActive" />
<section *ngIf="home.isActive"></section>
Zmienna routerLinkActive
jest powiązana ze zmienną szablonową, a następnie ponownie używana w razie potrzeby. Niestety jedynym zastrzeżeniem jest to, że nie możesz mieć tego wszystkiego na elemencie <section>
, ponieważ #home
musi być rozwiązane przed do parsera uderzającego <section>
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-21 10:03:51
Szukałem sposobu na użycie stylu Bootstrap Twittera z Angular2, ale miałem problem z zastosowaniem klasy active
do elementu nadrzędnego wybranego linku. Okazało się, że rozwiązanie @alex-correia-santos działa idealnie!
Komponent zawierający tabulatory musi zaimportować router i zdefiniować go w jego konstruktorze, zanim będzie można wykonać niezbędne połączenia.
Oto uproszczona wersja mojej implementacji...import {Component} from 'angular2/core';
import {Router, RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router';
import {HomeComponent} from './home.component';
import {LoginComponent} from './login.component';
import {FeedComponent} from './feed.component';
@Component({
selector: 'my-app',
template: `
<ul class="nav nav-tabs">
<li [class.active]="_r.isRouteActive(_r.generate(['Home']))">
<a [routerLink]="['Home']">Home</a>
</li>
<li [class.active]="_r.isRouteActive(_r.generate(['Login']))">
<a [routerLink]="['Login']">Sign In</a>
</li>
<li [class.active]="_r.isRouteActive(_r.generate(['Feed']))">
<a [routerLink]="['Feed']">Feed</a>
</li>
</ul>`,
styleUrls: ['app/app.component.css'],
directives: [ROUTER_DIRECTIVES]
})
@RouteConfig([
{ path:'/', component:HomeComponent, name:'Home', useAsDefault:true },
{ path:'/login', component:LoginComponent, name:'Login' },
{ path:'/feed', component:FeedComponent, name:'Feed' }
])
export class AppComponent {
title = 'My App';
constructor( private _r:Router ){}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 18:25:40
Załóżmy, że chcesz dodać CSS do mojego aktywnego stanu / karty. Użyj routerLinkActive , aby aktywować łącze routingu.
uwaga: 'active' to nazwa mojej klasy
<style>
.active{
color:blue;
}
</style>
<a routerLink="/home" [routerLinkActive]="['active']">Home</a>
<a routerLink="/about" [routerLinkActive]="['active']">About</a>
<a routerLink="/contact" [routerLinkActive]="['active']">Contact</a>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-12 13:52:10
Używam routera angular ^3.4.7
i nadal mam problemy z dyrektywą routerLinkActive
.
To nie działa, jeśli masz wiele linków z tym samym adresem url i nie wydaje się, aby odświeżać cały czas.
Zainspirowany @tomaszbak odpowiedz stworzyłem mały komponent do wykonania zadania
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 20:13:33
Proste rozwiązanie dla użytkowników angular 5 jest, wystarczy dodać routerLinkActive
do pozycji listy.
A routerLinkActive
dyrektywa jest związana z drogą za pośrednictwem routerLink
dyrektywy.
Przyjmuje jako wejście tablicę klas, które dodaje do elementu, do którego jest dołączona, jeśli jego trasa jest aktualnie aktywna, tak:
<li class="nav-item"
[routerLinkActive]="['active']">
<a class="nav-link"
[routerLink]="['home']">Home
</a>
</li>
Powyższe spowoduje dodanie klasy active do znacznika kotwicy, jeśli aktualnie oglądamy trasę główną.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-17 10:19:44
Czysty szablon html bądź jak
<a [routerLink]="['/home']" routerLinkActive="active">Home</a>
<a [routerLink]="['/about']" routerLinkActive="active">About us</a>
<a [routerLink]="['/contact']" routerLinkActive="active">Contacts</a>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 13:05:06