Czy AngularJS pomaga w jakikolwiek sposób ustawić active
klasę w linku do bieżącej strony?
Wyobrażam sobie, że jest to magiczny sposób, ale nie mogę tego znaleźć.
Moje menu wygląda następująco:
<ul>
<li><a class="active" href="/tasks">Tasks</a>
<li><a href="/actions">Tasks</a>
</ul>
i mam kontrolery dla każdego z nich na moich trasach: TasksController
i ActionsController
.
Ale nie mogę znaleźć sposobu na powiązanie „aktywnej” klasy z a
łączami do kontrolerów.
Jakieś wskazówki?
ngClass="{active: isActive('/tasks')}
, w którejisActive()
zwraca wartość logiczną, ponieważ oddziela kontroler i znaczniki / styl.Sugeruję użycie dyrektywy dotyczącej linku.
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
var path = $(element).children("a")[0].hash.substring(1);
. To zadziała dla stylu typu<li active-link="active"><a href="#/dashboard">Dashboard</a></li>
scope.$watch('location.path()', function(newPath) {
nascope.$on('$locationChangeStart', function(){
.var path = attrs.href;
navar path = attrs.href||attrs.ngHref;
<li>
, możesz zmienićelement.addClass(clazz);
naelement.parent().addClass(clazz);
Oto proste podejście, które działa dobrze w Angular.
W twoim kontrolerze AngularJS:
Wątek zawiera wiele innych podobnych odpowiedzi.
Jak ustawić aktywną klasę paska startowego paska nawigacyjnego za pomocą Angular JS?
źródło
return viewLocation === $location.path()
Aby dodać moje 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. (np.
#/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 (np.
example.com/#
Lub po prostuexample.com
), musi mieć przynajmniejexample.com/#/
lub tylkoexample.com#/
. Ale dzieje się to automatycznie z ngResource i podobnymi.A oto skrzypce: http://jsfiddle.net/gy2an/8/
źródło
W moim przypadku rozwiązałem ten problem, tworząc prosty kontroler odpowiedzialny za nawigację
I po prostu dodając klasę ng do elementu tak:
źródło
Dla użytkowników routera AngularUI :
I to umieści
active
klasę na wybranym obiekcie.źródło
Istnieje
ng-class
dyrektywa, która wiąże zmienną i klasę css. Akceptuje również obiekt (pary nazwa-klasy vs pary wartości bool).Oto przykład: http://plnkr.co/edit/SWZAqj
źródło
/test1/blahblah
czy to będzie?active: activePath=='/test1'
automatycznie zwraca „aktywne”, czy ścieżka zaczyna się od podanego ciągu? Czy jest to jakiś predefiniowany operator lub wyrażenie regularne?==
kontroli w html.odpowiedź od @ Renan-Tomal-Fernandes jest dobra, ale potrzebne kilka ulepszeń działało poprawnie. W obecnej postaci zawsze wykrywał link do strony głównej (/) po uruchomieniu, nawet jeśli byłeś w innej sekcji.
Więc trochę to poprawiłem, oto kod. Pracuję z Bootstrap, więc aktywna część jest w
<li>
elemencie zamiast w<a>
.Kontroler
Szablon
źródło
Oto rozwiązanie, które wymyśliłem po przeczytaniu kilku doskonałych sugestii powyżej. W mojej szczególnej sytuacji próbowałem użyć komponentu kart Bootstrap jako menu, ale nie chciałem używać wersji Angular-UI, ponieważ chcę, aby karty działały jako menu, w którym każda karta może zawierać zakładki, zamiast kart działających jako nawigacja dla pojedynczej strony. (Patrz http://angular-ui.github.io/bootstrap/#/tabs jeśli jesteś zainteresowany tym, jak wygląda wersja Angular-UI kart bootstrap).
Naprawdę podobała mi się odpowiedź kfis na temat stworzenia własnej dyrektywy, aby sobie z tym poradzić, jednak wydawało się kłopotliwe mieć dyrektywę, która musi być umieszczona na każdym linku. Stworzyłem więc własną dyrektywę Angular, która zamiast tego jest umieszczana raz na
ul
. Na wypadek, gdyby ktokolwiek próbował zrobić to samo, pomyślałem, że opublikuję to tutaj, chociaż, jak powiedziałem, wiele z powyższych rozwiązań również działa. Jest to nieco bardziej złożone rozwiązanie, jeśli chodzi o javascript, ale tworzy komponent wielokrotnego użytku z minimalnym znacznikiem.Oto javascript dla dyrektywy i dostawca trasy dla
ng:view
:Następnie w swoim html po prostu:
Oto plunker: http://plnkr.co/edit/xwGtGqrT7kWoCKnGDHYN?p=preview .
źródło
Możesz to zaimplementować bardzo prosto, oto przykład:
Twój kontroler powinien wyglądać tak:
źródło
użyj dyrektywy ui-sref-active w angular-ui-router https://github.com/angular-ui/ui-router/wiki/Quick-Reference#statename
źródło
Miałem podobny problem z menu znajdującym się poza zasięgiem kontrolera. Nie jestem pewien, czy jest to najlepsze, czy zalecane rozwiązanie, ale to właśnie dla mnie zadziałało. Dodałem następujące elementy do mojej konfiguracji aplikacji:
Następnie w widoku mam:
źródło
Używanie Angulara Wersja 6 z Bootstrap 4.1
Udało mi się to zrobić tak, jak pokazano poniżej.
W poniższym przykładzie, gdy URL widzi „/ contact”, aktywny bootstrap jest następnie dodawany do znacznika HTML. Kiedy adres URL się zmienia, jest on następnie usuwany.
Przeczytaj więcej na stronie Angular
źródło
Korzystając z dyrektywy (ponieważ tutaj wykonujemy manipulację DOM), prawdopodobnie najbardziej zbliżamy się do wykonywania rzeczy „pod kątem”:
Wtedy twój HTML wyglądałby następująco:
źródło
menu-item
wydaje się zbędny na każdej linii. Być może dołączenie atrybutu doul
elementu (np.<ul menu>
) Byłoby lepsze, ale nie jestem pewien, czy byłoby to możliwe.Zrobiłem tak:
Dzięki temu możesz mieć linki w sekcji, która ma dyrektywę track-active:
To podejście wydaje mi się znacznie czystsze niż inne.
Ponadto, jeśli używasz jQuery, możesz uczynić go o wiele bardziej przyjaznym, ponieważ jQlite ma tylko podstawową obsługę selektora. O wiele czystsza wersja z jquery zawartą przed angular zawierałaby się tak:
Oto jsFiddle
źródło
Moje rozwiązanie tego problemu, użyj
route.current
w szablonie kątowym.Ponieważ masz
/tasks
trasę do wyróżnienia w menu, możesz dodać własną właściwośćmenuItem
do tras zadeklarowanych przez moduł:Następnie w swoim szablonie
tasks.html
możesz użyć następującejng-class
dyrektywy:Moim zdaniem jest to znacznie czystsze niż wszystkie proponowane rozwiązania.
źródło
Oto rozszerzenie dyrektywy kfis, które zrobiłem, aby umożliwić różne poziomy dopasowania ścieżki. Zasadniczo znalazłem potrzebę dopasowania ścieżek URL do określonej głębokości, ponieważ dokładne dopasowanie nie pozwala na zagnieżdżanie i domyślne przekierowania stanu. Mam nadzieję że to pomoże.
A oto jak korzystam z linku
Ta dyrektywa będzie odpowiadać poziomowi głębokości określonemu w wartości atrybutu dyrektywy. Oznacza to, że można go wielokrotnie używać w innym miejscu.
źródło
Oto kolejna dyrektywa podkreślająca aktywne linki.
Kluczowe cechy:
Kod:
Stosowanie:
Prosty przykład z wyrażeniem kątowym, powiedzmy $ scope.var = 2 , wtedy link będzie aktywny, jeśli lokalizacja to / url / 2 :
Przykład bootstrapu, rodzic li uzyska aktywną klasę:
Przykład z zagnieżdżonymi adresami URL, link będzie aktywny, jeśli jakikolwiek zagnieżdżony adres URL jest aktywny (tj. / Url / 1 , / url / 2 , url / 1/2 / ... )
Złożony przykład, link wskazuje na jeden adres URL ( / url1 ), ale będzie aktywny, jeśli zostanie wybrany inny adres ( / url2 ):
Przykład z wyłączonym linkiem, jeśli nie jest aktywny, będzie miał klasę „wyłączoną” :
Wszystkie atrybuty active-link- * mogą być używane w dowolnej kombinacji, więc można zastosować bardzo złożone warunki.
źródło
Jeśli chcesz, aby linki do dyrektywy były umieszczone w opakowaniu, a nie wybieranie poszczególnych linków (ułatwia przeglądanie zakresu w Batarang), działa to również całkiem dobrze:
Znaczniki będą po prostu:
Powinienem również wspomnieć, że w tym przykładzie używam jQuery z pełną zawartością tłuszczu, ale możesz łatwo zmienić to, co zrobiłem z filtrowaniem i tak dalej.
źródło
Oto moje dwa centy, działa dobrze.
UWAGA: Nie pasuje to do stron podrzędnych (czego potrzebowałem).
Widok:
Kontroler:
źródło
Zgodnie z odpowiedzią @kfis są to komentarze i, moim zdaniem, ostateczna dyrektywa jak poniżej:
źródło
Dla tych, którzy używają interfejsu użytkownika, moja odpowiedź jest nieco podobna do Ender2050, ale wolę to zrobić poprzez testowanie nazwy stanu:
odpowiadający HTML:
źródło
Żadna z powyższych sugestii dotyczących dyrektywy nie była dla mnie przydatna. Jeśli masz pasek nawigacyjny bootstrap taki jak ten
(może to być
$ yo angular
startup), a następnie chcesz dodać.active
do listy klas elementów nadrzędnych<li>
, a nie sam element; tj<li class="active">..</li>
. Więc napisałem to:użycie
set-parent-active
;.active
jest domyślne, więc nie trzeba go ustawiaća
<li>
element nadrzędny będzie,.active
gdy łącze jest aktywne. Aby użyć alternatywnej.active
klasy.highlight
, po prostuźródło
Najważniejsze dla mnie było to, aby nie zmieniać w ogóle domyślnego kodu bootstrap. Oto mój kontroler menu, który wyszukuje opcje menu, a następnie dodaje pożądane zachowanie.
źródło
miał ten sam problem. Oto moje rozwiązanie :
źródło
Właśnie napisałem w tym celu dyrektywę.
Stosowanie:
Realizacja:
Testy:
źródło
Trasa:
Menu html:
Kontroler:
Problem, który tu znalazłem, polega na tym, że element menu jest aktywny tylko po załadowaniu całej strony. Po załadowaniu widoku częściowego menu się nie zmienia. Ktoś wie, dlaczego tak się dzieje?
źródło
źródło
Znalazłem najłatwiejsze rozwiązanie. aby porównać indexOf w HTML
źródło