Jeśli mam pasek nawigacyjny w bootstrapie z przedmiotami
Home | About | Contact
Jak ustawić aktywną klasę dla każdej pozycji menu, gdy są one aktywne? To znaczy, jak mogę ustawić, class="active"
kiedy trasa kątowa jest na
#/
dla domu#/about
na stronie z informacjami#/contact
na stronie kontaktowej
javascript
twitter-bootstrap
angularjs
angularjs-directive
navbar
użytkownik1876508
źródło
źródło
Odpowiedzi:
Bardzo eleganckim sposobem jest użycie kontrolera ng do uruchomienia pojedynczego kontrolera poza widokiem ng:
i dołącz do kontrolerów.js:
źródło
return $location.path().indexOf(viewLocation) == 0;
zamiast tego, abyś mógł również złapać strony z parametramielegant
- nazwa trasy np./dogs
Musi zostać zduplikowana w wezwaniu doisActive('/dogs')
ui-sref-active/ui-sref-active-eq
dyrektyw, tj.ui-sref-active-eq='active'
lubui-sref-active='active'
by osiągnąć te same wynikiWłaśnie napisałem dyrektywę, aby to obsłużyć, więc możesz po prostu dodać atrybut
bs-active-link
do<ul>
elementu nadrzędnego , a za każdym razem, gdy zmieni się trasa, znajdzie pasujące łącze i dodaactive
klasę do odpowiedniego<li>
.Możesz zobaczyć to w akcji tutaj: http://jsfiddle.net/8mcedv3b/
Przykładowy HTML:
JavaScript:
źródło
Możesz rzucić okiem na AngularStrap , dyrektywa navbar wydaje się być tym, czego szukasz:
https://github.com/mgcrea/angular-strap/blob/master/src/navbar/navbar.js
Aby skorzystać z tej dyrektywy:
Pobierz AngularStrap z http://mgcrea.github.io/angular-strap/
Dołącz skrypt na swojej stronie po bootstrap.js:
<script src="lib/angular-strap.js"></script>
Dodaj dyrektywy do swojego modułu:
angular.module('myApp', ['$strap.directives'])
Dodaj dyrektywę do paska nawigacyjnego:
<div class="navbar" bs-navbar>
Dodaj wyrażenia regularne do każdego elementu nawigacji:
<li data-match-route="/about"><a href="#/about">About</a></li>
źródło
scope.$watch
)element
zmienna jest przekazywana do selektora jquery?$('...', element)
mgcrea.ngStrap
nie jest$strap.directives
Oto proste podejście, które działa dobrze w Angular.
W twoim kontrolerze AngularJS:
źródło
Jeśli pracujesz z routerem Angular, dyrektywa RouterLinkActive może być używana bardzo elegancko:
źródło
active
klasa powinna być w<li>
(możesz ustawić routerLinkActive z routLink lub jego rodzicem)/
jako strony głównej,routerLinkActive
weźmie pod uwagę, że aktywna dla dowolnego adresu URL zaczynającym się/
np/foo/
,/foo/bar
itp dopasować dokładnie, czego potrzebujeszrouterLinkActive="active" [routerLinkActiveOptions]="{exact:true}"
.Przede wszystkim problem ten można rozwiązać na wiele sposobów. Ten sposób może nie być najbardziej elegancki, ale na pewno działa.
Oto proste rozwiązanie, które powinieneś być w stanie dodać do każdego projektu. Możesz po prostu dodać „pageKey” lub inną właściwość podczas konfigurowania trasy, której możesz użyć do wyłączenia. Dodatkowo można zaimplementować detektor w metodzie $ routeChangeSuccess obiektu $ route, aby nasłuchiwać pomyślnego zakończenia zmiany trasy.
Kiedy twój handler odpala, dostajesz klawisz strony i użyj go, aby zlokalizować elementy, które muszą być „AKTYWNE” dla tej strony, i zastosuj klasę ACTIVE.
Pamiętaj, że potrzebujesz sposobu, aby WSZYSTKIE elementy były „AKTYWNE”. Jak widać, używam klasy .pageKey na moich elementach nawigacyjnych, aby je wszystkie wyłączyć, i używam .pageKey_ {PAGEKEY}, aby je indywidualnie włączyć. Przełączenie ich wszystkich w nieaktywne byłoby uważane za naiwne podejście, potencjalnie można uzyskać lepszą wydajność, korzystając z poprzedniej trasy, aby unieruchomić tylko aktywne elementy, lub można zmienić selektor jquery, aby wybrać tylko aktywne elementy, które mają być nieaktywne. Użycie jquery do zaznaczenia wszystkich aktywnych elementów jest prawdopodobnie najlepszym rozwiązaniem, ponieważ zapewnia, że wszystko zostanie wyczyszczone dla bieżącej trasy w przypadku błędów css, które mogły występować na poprzedniej trasie.
Co oznaczałoby zmianę tego wiersza kodu:
do tego
Oto przykładowy kod:
Biorąc pod uwagę pasek startowy
I moduł kątowy i kontroler, takie jak:
źródło
Rzeczywiście można użyć -UI-utils kątową '
ui-route
dyrektywę:lub:
Kontroler nagłówka
Strona indeksu
Jeśli używasz interfejsu użytkownika, możesz również interesować się interfejsem użytkownika do zarządzania widokami częściowymi / zagnieżdżonymi.
źródło
Niestety, wszystkie te odpowiedzi są dla mnie zbyt skomplikowane. Stworzyłem więc małą dyrektywę, która powinna działać dla poszczególnych pasków nawigacyjnych:
Stosowanie:
źródło
Aby to osiągnąć, używam dyrektywy klasy ng z $ location.
Wymaga, aby pasek nawigacyjny znajdował się w głównym kontrolerze z dostępem do usługi lokalizacji $ w następujący sposób:
źródło
Możesz to osiągnąć za pomocą warunkowego wyrażenia kątowego, takiego jak:
Biorąc to pod uwagę, uważam dyrektywę kątową za bardziej „właściwą” metodę, nawet jeśli outsourcing wielu z tej mini-logiki może nieco zanieczyścić bazę kodu.
Podczas projektowania używam warunkowej stylizacji GUI od czasu do czasu, ponieważ jest to trochę szybsze niż tworzenie dyrektyw. Nie mogę ci powiedzieć o instancji, w której faktycznie długo pozostawały w bazie kodu. W końcu albo przekształcę to w dyrektywę, albo znajdę lepszy sposób na rozwiązanie problemu.
źródło
Jeśli używasz interfejsu użytkownika routera , poniższy przykład powinien zaspokoić Twoje potrzeby w oparciu o komentarz @ DanPantry do zaakceptowanej odpowiedzi bez dodawania kodu po stronie kontrolera:
Możesz sprawdzić dokumenty, aby uzyskać więcej informacji na ten temat.
źródło
ui.router
!Jeśli wolisz nie używać AngularStrap, ta dyrektywa powinna załatwić sprawę ! To jest modyfikacja https://stackoverflow.com/a/16231859/910764 .
JavaScript
HTML
Uwaga: powyższe klasy HTML zakładają, że używasz Bootstrap 3.x
źródło
Oto moje zdanie na ten temat. Trochę kombinacji odpowiedzi znalezionych w tym poście. Miałem nieco inny przypadek, więc moje rozwiązanie polega na podzieleniu menu na własny szablon do użycia w definicji dyrektywy Ojbect, a następnie dodaniu paska nawigacyjnego do strony, na której go potrzebowałem. Zasadniczo miałem stronę logowania, do której nie chciałem dołączać swojego menu, więc użyłem ngInclude i wstawiłem tę dyrektywę po zalogowaniu:
DYREKTYWA:
SZABLON DYREKTYWNY (templates / menu.html)
HTML, KTÓRY ZAWIERA DYREKTYWĘ
Mam nadzieję że to pomoże
źródło
Rozszerzając odpowiedź myl, potrzebowałem tego do obsługi takiej struktury.
-indeks
-events <-aktywna
--- lista
zdarzeń
--- edycja zdarzeń --- mapa zdarzeń <-kliknięcie
-places
--- lista
-miejsc
--- edycja-miejsc --- mapa-miejsc
więc zamiast dopasowywania musiałem użyć indexOf, aby zweryfikować łącza potomne sformatowane pod kątem spełnienia warunku. Tak więc w przypadku „wydarzeń”:
źródło
To proste rozwiązanie
źródło
W połączeniu z odpowiedzią AngularStrap @ Oliviera zaimplementowałem również odpowiedź Kevinknelsona z: https://github.com/twbs/bootstrap/issues/9013 .
Natywnie pasek nawigacyjny Bootstrap3 nie został zaprojektowany dla aplikacji jednostronicowej (np. Angular), a zatem menu na małym ekranie nie zwijało się po kliknięciu.
źródło
JavaScript
HTML
źródło
Dzięki @Pylinux . Użyłem jego techniki, a także zmodyfikowałem ją, aby obsługiwała „jeden” poziom menu rozwijanego (sub ul / li), ponieważ tego właśnie potrzebowałem. Zobacz to w akcji w linku skrzypce poniżej.
Zaktualizowano Fiddle na podstawie odpowiedzi pylinuksa - http://jsfiddle.net/abhatia/en4qxw6g/
Dokonałem następujących trzech zmian, aby obsłużyć menu rozwijane o jeden poziom:
1. Dodałem wartość klasy dd (menu rozwijane) dla elementu „a” pod li, który musi mieć listę podrzędną.
2. Zaktualizowano Javascript, aby dodać następującą nową logikę.
3. Zaktualizowano CSS, aby dodać:
Mam nadzieję, że będzie to pomocne dla kogoś, kto chce wdrożyć menu rozwijane na jednym poziomie.
źródło
Użyj obiektu jako zmiennej przełączającej.
Możesz to zrobić po prostu za pomocą:
Za każdym razem, gdy klikniesz łącze, obiekt przełączający jest zastępowany nowym obiektem, w którym tylko poprawna właściwość obiektu przełączającego jest prawdziwa. Niezdefiniowane właściwości zostaną ocenione jako fałszywe, więc elementy zależne od nich nie będą miały przypisanej klasy aktywnej.
źródło
Możesz także skorzystać z tej dyrektywy active-link https://stackoverflow.com/a/23138152/1387163
Rodzic li uzyska aktywną klasę, gdy lokalizacja pasuje / URL :
źródło
Sugeruję użycie dyrektywy dotyczącej linku. Oto skrzypce.
Ale jeszcze nie jest idealny. Uważaj na hashbangi;)
Oto javascript dla dyrektywy:
a oto, jak miałby być użyty w HTML:
następnie stylizacja za pomocą css:
źródło
Aby dodać dwa centy do debaty, stworzyłem czysty moduł kątowy (bez jquery), i będzie on również działał z adresami skrótu zawierającymi dane. ( ig
#/this/is/path?this=is&some=data
)Po prostu dodajesz moduł jako zależność i
auto-active
do jednego z przodków menu. Lubię to:Moduł wygląda następująco:
* (Oczywiście możesz po prostu użyć części dotyczącej dyrektywy)
** Warto również zauważyć, że nie działa to dla pustych skrótów ( ig
example.com/#
lub po prostuexample.com
), musi mieć przynajmniejexample.com/#/
lub po prostuexample.com#/
. Ale dzieje się to automatycznie z ngResource i podobnymi.źródło
To załatwiło sprawę:
następnie używasz jquery (działa również z angular), aby dodać klasę aktywną
i oczywiście css:
działa to, jeśli masz swój HTML:
to atumatycznie doda klasę aktywną za pomocą adresu URL strony i pokoloruje tło na czerwono, jeśli jesteś na stronie www.somesite.com/ee thaen ee to „aplikacja” i będzie ona aktywna
źródło
To jest długo odpowiedź, ale pomyślałem, że podzielę się swoją drogą:
Szablon:
Dla osób używających
ui-router
:Aby dopasować dokładnie (np. Stany zagnieżdżone?) Użyj
$state.name === 'full/path/to/state'
lubui-sref-active-eq="active"
źródło
Oto inne rozwiązanie dla każdego, kto może być zainteresowany. Zaletą tego jest to, że ma mniej zależności. Cholera, działa również bez serwera WWW. Więc to całkowicie po stronie klienta.
HTML:
Wyjaśnienie:
Tutaj generujemy linki dynamicznie z modelu angularjs przy użyciu dyrektywy
ng-repeat
. Magia dzieje się z metodamiselectTab()
igetTabClass()
zdefiniowany w sterowniku dla tego paska nawigacyjnego przedstawionej poniżej.Kontroler:
Wyjaśnienie:
selectTab()
Metoda jest wywoływana przy użyciung-click
dyrektywy. Tak więc po kliknięciu łącza zmiennaselectedTab
jest ustawiana na nazwę tego łącza. W kodzie HTML widać, że ta metoda jest wywoływana bez żadnego argumentu na karcie Narzędzia główne, dzięki czemu zostanie podświetlona podczas ładowania strony.getTabClass()
Metoda jest wywoływana przezng-class
dyrektywę w HTML. Ta metoda sprawdza, czy zakładka, w której się znajduje, jest taka sama jak wartośćselectedTab
zmiennej. Jeśli true, zwraca „aktywne”, w przeciwnym razie zwraca „”, które jest stosowane jako nazwa klasy przezng-class
dyrektywę. Następnie css zastosowany do klasyactive
zostanie zastosowany do wybranej karty.źródło
Musisz tylko dodać wymaganą
active
klasę z wymaganym kodem koloru.Dawny:
ng-class="{'active': currentNavSelected}" ng-click="setNav"
źródło