UWAGA: Istnieje wiele różnych odpowiedzi, a większość z nich była poprawna w tym samym czasie. Faktem jest, że to, co działa, zmieniało się wiele razy, gdy zespół Angular zmienił swój router. Wersja Routera 3.0, która ostatecznie stanie się routerem w Angular, łamie wiele z tych rozwiązań, ale oferuje bardzo proste własne rozwiązanie. Począwszy od wersji RC.3, preferowanym rozwiązaniem jest użycie, [routerLinkActive]
jak pokazano w tej odpowiedzi .
W aplikacji Angular (bieżącej w wersji 2.0.0-beta.0, gdy to piszę), w jaki sposób określasz, jaka jest obecnie aktywna trasa?
Pracuję nad aplikacją korzystającą z Bootstrap 4 i potrzebuję sposobu, aby oznaczyć łącza / przyciski nawigacyjne jako aktywne, gdy ich powiązany komponent jest wyświetlany w <router-output>
znaczniku.
Zdaję sobie sprawę, że sam mógłbym utrzymać stan po kliknięciu jednego z przycisków, ale nie obejmowałoby to przypadku posiadania wielu ścieżek na tej samej trasie (powiedzmy główne menu nawigacyjne, a także menu lokalne w głównym komponencie ).
Wszelkie sugestie lub linki będą mile widziane. Dzięki.
źródło
@input
opcje for, aleexact: false
aktywuje klasę, gdy aktywne jest również rodzeństwo bieżącej trasy.router.navigate()
że zadziałałoby dobrze.routerLinkActive
jest po prostu wskaźnikiem tego, czy ten link reprezentuje aktywną trasę.Odpowiedziałem na to w innym pytaniu, ale wydaje mi się, że to może mieć znaczenie również w tym przypadku. Oto link do oryginalnej odpowiedzi: Angular 2: Jak ustalić aktywną trasę za pomocą parametrów?
Próbowałem ustawić aktywną klasę, nie musząc dokładnie wiedzieć, jaka jest bieżąca lokalizacja (używając nazwy trasy) . Najlepszym rozwiązaniem do tej pory jest skorzystanie z funkcji isRouteActive dostępnej w
Router
klasie.router.isRouteActive(instruction): Boolean
pobiera jeden parametr, który jest obiektem trasyInstruction
i zwracatrue
lubfalse
czy ta instrukcja ma wartość true dla bieżącej trasy, czy nie. Można wygenerować trasęInstruction
za pomocąRouter
„s generowanie (linkParams: Array) . LinkParams ma dokładnie ten sam format, co wartość przekazana do dyrektywy routerLink (nprouter.isRouteActive(router.generate(['/User', { user: user.id }]))
.).Tak może wyglądać RouteConfig (trochę go poprawiłem, aby pokazać użycie parametrów) :
A View będzie wyglądać następująco:
To było moje preferowane rozwiązanie problemu do tej pory, może być również pomocne dla ciebie.
źródło
router.isRouteActive('Home')
.Router
konstruktora klasyname
zamiastas
w obiekcie konfiguracji routera.router.urlTree.contains(router.createUrlTree(['Home']))
Rozwiązałem problem napotkany w tym linku i okazało się, że istnieje proste rozwiązanie dla twojego pytania. Możesz użyć
router-link-active
zamiast tego w swoich stylach.źródło
router-link-active
klasa nie jest dodawana do aktywnegoa
lubli
. ale jest jedno miejsce, w którym używam bootstrapnav-tabs
i działa tam.Małe ulepszenie odpowiedzi @ Alex-Correia-Santos na podstawie https://github.com/angular/angular/pull/6407#issuecomment-190179875
I użyj tego w ten sposób:
źródło
styles : [
.active {background-color: aliceblue; }]
. +1 to działaMożesz sprawdzić bieżącą trasę, wstrzykując
Location
obiekt do kontrolera i sprawdzającpath()
:Najpierw musisz go zaimportować:
Następnie możesz użyć wyrażenia regularnego, aby dopasować do zwróconej ścieżki, aby zobaczyć, która trasa jest aktywna. Zauważ, że
Location
klasa zwraca znormalizowaną ścieżkę niezależnie od tegoLocationStrategy
, którego używasz. Więc nawet jeśli korzystasz zeHashLocationStragegy
zwróconych ścieżek, nadal będą miały formę/foo/bar
nie#/foo/bar
źródło
AKTUALIZACJA: zaktualizowana zgodnie z Angular2.4.x
Zobacz więcej...
źródło
Aby oznaczyć aktywne trasy,
routerLinkActive
można użyćDziała to również na inne elementy, takie jak
Jeśli częściowe mecze również powinny być oznaczone, użyj
O ile wiem,
exact: false
będzie to domyślna wersja RC.4źródło
Obecnie używam rc.4 z bootstrap 4 i ten działa idealnie dla mnie:
To zadziała dla adresu url: / home
źródło
/home/whatever
?exact
znaczy, że trasa będzie miała tę samą nazwę. Jest to wymagane, jeśli planujesz używać go z narzędziami takimi jak Twitter Bootstrap. Obsługuje już stan aktywnego łącza i bezexact
opcji nie będzie działać. (nie jestem pewien, jak to działa w rdzeniu, próbowałem i działa dla mnie)Poniżej znajduje się metoda wykorzystująca RouteData do stylizacji elementów menuBar w zależności od bieżącej trasy:
RouteConfig zawiera dane z zakładką (aktualna trasa):
Kawałek układu:
Klasa:
źródło
Pomyślałem, że dodam w przykładzie, który nie używa żadnego maszynopisu:
routerLinkActive
Zmienna jest zobowiązany do zmiennej szablonu, a następnie ponownie wykorzystywane zgodnie z wymaganiami. Niestety jedynym zastrzeżeniem jest to, że nie możesz mieć tego wszystkiego na<section>
elemencie, ponieważ#home
należy to rozwiązać przed uderzeniem parsera<section>
.źródło
Router
w Angular 2 RC już nie definiujeisRouteActive
i niegenerate
stosuje metod.Spróbuj śledzić
Uwaga,
routeSegment : RouteSegment
musi zostać wstrzyknięty do konstruktora komponentu.źródło
Oto kompletny przykład dodawania aktywnego stylu trasy w wersji Angular,
2.0.0-rc.1
która uwzględnia zerowe ścieżki główne (np.path: '/'
)app.component.ts -> Trasy
app.component.html
źródło
Rozwiązanie dla Angular2 RC 4:
źródło
Od wersji Angular 8 działa to:
{ exact: true }
zapewnia, że pasuje do adresu URL.źródło
w 2020 r., jeśli chcesz ustawić klasę aktywną na elemencie, który nie ma [routerLink] - możesz po prostu:
źródło
Kolejne obejście. Znacznie łatwiej w Angular Router V3 Alpha. przez wstrzyknięcie routera
stosowanie
źródło
W Angular2 RC2 możesz użyć tej prostej implementacji
to doda klasę
active
do elementu o dopasowanym adresie URL, czytaj więcej o tym tutajźródło
Poniżej znajdują się odpowiedzi na to pytanie dla wszystkich wersji Angular 2 RC wydanych do dnia:
RC4 i RC3 :
Aby zastosować klasę do linku lub przodka linku:
/ home powinien być adresem URL, a nie nazwą trasy, ponieważ właściwość name nie istnieje już w obiekcie trasy od routera v3.
Więcej informacji o dyrektywie routerLinkActive pod tym linkiem .
Aby zastosować klasę do dowolnego div na podstawie bieżącej trasy:
na przykład
RC2 i RC1 :
Użyj kombinacji router.isRouteActive i klasy. *. np. zastosować klasę aktywną na podstawie trasy domowej.
Nazwę i adres URL można przekazać do router.generate.
źródło
Używanie
routerLinkActive
jest dobre w prostych przypadkach, gdy istnieje link i chcesz zastosować niektóre klasy. Ale w bardziej złożonych przypadkach, w których możesz nie mieć routera Link lub gdy potrzebujesz czegoś więcej, możesz utworzyć i użyć potoku :następnie:
i nie zapomnij dołączyć rury do zależności rur;)
źródło
containsTree
zdefiniowane?W przypadku wersji Angular 4+ nie musisz używać żadnego złożonego rozwiązania. Możesz po prostu użyć
[routerLinkActive]="'is-active'"
.Na przykład z linkiem nawigacyjnym bootstrap 4:
źródło
Instancja klasy Router jest w rzeczywistości Obserowalna i zwraca bieżącą ścieżkę za każdym razem, gdy się zmienia. Tak to robię:
A potem w moim HTML:
źródło
Jak wspomniano w jednym z komentarzy do zaakceptowanej odpowiedzi,
routerLinkActive
dyrektywę można również zastosować do kontenera rzeczywistego<a>
znacznika.Na przykład z kartami Bootstrap na Twitterze, gdzie aktywna klasa powinna być zastosowana do
<li>
tagu zawierającego link:Całkiem schludnie! Podejrzewam, że dyrektywa sprawdza zawartość tagu i szuka
<a>
tagu zrouterLink
dyrektywą.źródło
Prostym rozwiązaniem dla 5 użytkowników kątowych jest, po prostu dodaj
routerLinkActive
do elementu listy.routerLinkActive
Dyrektywa związana jest z trasy przezrouterLink
dyrektywy.Jako dane wejściowe przyjmuje tablicę klas, które doda do elementu, do którego jest dołączony, jeśli jego trasa jest obecnie aktywna, na przykład:
Powyższe doda klasę aktywną do tagu zakotwiczenia, jeśli aktualnie oglądamy trasę główną.
źródło
A w najnowszej wersji kątowej możesz po prostu zrobić sprawdzenie
router.isActive(routeNameAsString)
. Na przykład patrz przykład poniżej:I upewnij się, że nie zapominasz wstrzykiwać routera do swojego komponentu.
źródło
Szukałem sposobu korzystania z nawigacji w stylu Bootstrap na Twitterze w Angular2, ale miałem problem z uzyskaniem
active
zastosowaniem klasy do elementu nadrzędnego wybranego łącza. Okazało się, że rozwiązanie @ alex-correia-santos działa idealnie!Składnik zawierający zakładki musi zaimportować router i zdefiniować go w swoim konstruktorze, zanim będzie można wykonać niezbędne wywołania.
Oto uproszczona wersja mojej implementacji ...
źródło
powiedzmy, że chcesz dodać CSS do mojego aktywnego stanu / karty. Użyj routerLinkActive, aby aktywować łącze do routingu.
uwaga: „aktywne” to tutaj nazwa mojej klasy
źródło
Używam routera kątowego
^3.4.7
i nadal mam problemy zrouterLinkActive
dyrektywą.To nie działa, jeśli masz wiele linków z tym samym adresem URL i wydaje się, że nie odświeżają się cały czas.
Zainspirowany odpowiedzią @tomaszbak stworzyłem mały komponent do wykonania zadania
źródło
Czysty szablon HTML powinien być jak
źródło
zacznij od importowania RouterLinkActive do .ts
Teraz użyj RouterLinkActive w swoim HTML
podaj trochę css do klasy „class_Name”, ponieważ kiedy ten link będzie aktywny / kliknięty, znajdziesz klasę na rozpiętości podczas inspekcji.
źródło
Programowym sposobem byłoby zrobienie tego w samym komponencie. Zmagałem się z tym problemem przez trzy tygodnie, ale zrezygnowałem z kątowych dokumentów i przeczytałem rzeczywisty kod, który sprawił, że routerlinkactive działał, i to o najlepszych dokumentach, jakie mogę znaleźć.
Uwaga :
W celu zaprogramowania należy dodać łącze do routera, ponieważ wymaga ono elementu potomnego. Jeśli chcesz to zmienić, musisz pozbyć się dzieci
superclass.nativeElement
.źródło