Wenn ich eine Navigationsleiste im Bootstrap mit den Elementen habe
Home | About | Contact
Wie lege ich die aktive Klasse für jeden Menüpunkt fest, wenn sie aktiv sind? Das heißt, wie kann ich einstellen, class="active"
wann die Winkelroute ist
#/
für Zuhause#/about
für die About-Seite#/contact
für die Kontaktseite
javascript
twitter-bootstrap
angularjs
angularjs-directive
navbar
user1876508
quelle
quelle
Antworten:
Eine sehr elegante Möglichkeit besteht darin, mit ng-controller einen einzelnen Controller außerhalb der ng-Ansicht auszuführen:
und in controller.js aufnehmen:
quelle
return $location.path().indexOf(viewLocation) == 0;
stattdessen zu verwenden, damit Sie auch Seiten mit Parametern abfangen könnenelegant
- der Routenname muss zB/dogs
im Aufruf anisActive('/dogs')
ui-sref-active/ui-sref-active-eq
Anweisungen verwenden, dh.ui-sref-active-eq='active'
oderui-sref-active='active'
um die gleichen Ergebnisse zu erzielenIch habe gerade eine Anweisung geschrieben, um dies zu handhaben, sodass Sie das Attribut einfach
bs-active-link
zum übergeordneten<ul>
Element hinzufügen können. Jedes Mal, wenn sich die Route ändert, wird der passende Link gefunden und dieactive
Klasse zum entsprechenden hinzugefügt<li>
.Sie können es hier in Aktion sehen: http://jsfiddle.net/8mcedv3b/
Beispiel HTML:
Javascript:
quelle
Sie können sich AngularStrap ansehen . Die Navbar-Direktive scheint genau das zu sein, wonach Sie suchen:
https://github.com/mgcrea/angular-strap/blob/master/src/navbar/navbar.js
So verwenden Sie diese Richtlinie:
Laden Sie AngularStrap von http://mgcrea.github.io/angular-strap/ herunter.
Fügen Sie das Skript nach bootstrap.js in Ihre Seite ein:
<script src="lib/angular-strap.js"></script>
Fügen Sie die Anweisungen zu Ihrem Modul hinzu:
angular.module('myApp', ['$strap.directives'])
Fügen Sie die Direktive zu Ihrer Navigationsleiste hinzu:
<div class="navbar" bs-navbar>
Fügen Sie jedem Navigationselement reguläre Ausdrücke hinzu:
<li data-match-route="/about"><a href="#/about">About</a></li>
quelle
scope.$watch
element
Variable an den jquery-Selektor übergeben?$('...', element)
mgcrea.ngStrap
$strap.directives
Hier ist ein einfacher Ansatz, der gut mit Angular funktioniert.
In Ihrem AngularJS-Controller:
quelle
Wenn Sie mit einem Angular-Router arbeiten, kann die RouterLinkActive-Direktive sehr elegant verwendet werden:
quelle
active
Klasse in der<li>
(Sie können den routerLinkActive mit dem routerLink oder seinem übergeordneten/
als Ihre Startseite,routerLinkActive
wird diese aktiv für jede URL betrachten beginnend mit/
, zum Beispiel/foo/
,/foo/bar
usw. genau zu entsprechen, müssen SierouterLinkActive="active" [routerLinkActiveOptions]="{exact:true}"
.In erster Linie kann dieses Problem auf viele Arten gelöst werden. Dieser Weg ist vielleicht nicht der eleganteste, aber er funktioniert auf jeden Fall.
Hier ist eine einfache Lösung, die Sie jedem Projekt hinzufügen können sollten. Sie können einfach einen "pageKey" oder eine andere Eigenschaft hinzufügen, wenn Sie Ihre Route konfigurieren, die Sie zum Abmelden verwenden können. Darüber hinaus können Sie einen Listener für die $ routeChangeSuccess-Methode des $ route-Objekts implementieren, um auf den erfolgreichen Abschluss einer Routenänderung zu warten.
Wenn Ihr Handler ausgelöst wird, erhalten Sie den Seitenschlüssel und suchen mit diesem Schlüssel nach Elementen, die für diese Seite "AKTIV" sein müssen, und wenden die Klasse AKTIV an.
Denken Sie daran, dass Sie eine Möglichkeit benötigen, ALLE Elemente "IN AKTIV" zu machen. Wie Sie sehen können, verwende ich die .pageKey-Klasse für meine Navigationselemente, um sie alle auszuschalten, und ich verwende die .pageKey_ {PAGEKEY}, um sie einzeln einzuschalten. Wenn Sie alle auf inaktiv umschalten, wird dies als naiver Ansatz angesehen. Möglicherweise erzielen Sie eine bessere Leistung, wenn Sie die vorherige Route verwenden, um nur aktive Elemente inaktiv zu machen, oder Sie können die Auswahlabfrage so ändern, dass nur aktive Elemente ausgewählt werden, die inaktiv gemacht werden sollen. Die Verwendung von jquery zur Auswahl aller aktiven Elemente ist wahrscheinlich die beste Lösung, da dadurch sichergestellt wird, dass im Falle von CSS-Fehlern, die möglicherweise auf der vorherigen Route aufgetreten sind, alles für die aktuelle Route bereinigt wird.
Was bedeuten würde, diese Codezeile zu ändern:
zu diesem
Hier ist ein Beispielcode:
Gegeben eine Bootstrap Navbar von
Und ein Winkelmodul und eine Steuerung wie die folgende:
quelle
Sie können tatsächlich nutzen Winkel-ui-utils "
ui-route
Richtlinie:oder:
Header Controller
Indexseite
Wenn Sie UI-Utils verwenden, interessieren Sie sich möglicherweise auch für UI-Router zum Verwalten von partiellen / verschachtelten Ansichten.
quelle
Ich finde all diese Antworten für mich etwas zu kompliziert, sorry. Deshalb habe ich eine kleine Direktive erstellt, die pro Navigationsleiste funktionieren soll:
Verwendungszweck:
quelle
Ich verwende die Direktive der Klasse ng mit $ location, um dies zu erreichen.
Die Navigationsleiste muss sich in einem Hauptcontroller mit Zugriff auf den folgenden $ location-Dienst befinden:
quelle
Sie können dies mit einer Bedingung in einem Winkelausdruck erreichen, wie z.
Abgesehen davon finde ich, dass eine Winkelanweisung die "richtige" Methode ist, obwohl das Auslagern eines Großteils dieser Minilogik Ihre Codebasis etwas verschmutzen kann.
Während der Entwicklung verwende ich gelegentlich Bedingungen für das GUI-Styling, da dies etwas schneller ist als das Erstellen von Direktiven. Ich konnte Ihnen jedoch keinen Fall nennen, in dem sie tatsächlich lange in der Codebasis verblieben sind. Am Ende verwandle ich es entweder in eine Richtlinie oder finde einen besseren Weg, um das Problem zu lösen.
quelle
Wenn Sie einen UI-Router verwenden , sollte das folgende Beispiel Ihren Anforderungen entsprechen, basierend auf dem Kommentar von @ DanPantry zur akzeptierten Antwort, ohne einen Controller-seitigen Code hinzuzufügen:
Sie können die Dokumente für weitere Informationen überprüfen .
quelle
ui.router
!Wenn Sie AngularStrap lieber nicht verwenden möchten, sollte diese Anweisung den Trick machen!. Dies ist eine Änderung von https://stackoverflow.com/a/16231859/910764 .
JavaScript
HTML
Hinweis: Die obigen HTML-Klassen setzen voraus, dass Sie Bootstrap 3.x verwenden
quelle
Hier ist meine Meinung dazu. Eine kleine Kombination von Antworten in diesem Beitrag. Ich hatte einen etwas anderen Fall, daher besteht meine Lösung darin, das Menü in eine eigene Vorlage zu unterteilen, die in der Direktive Definition Ojbect verwendet werden soll, und dann meine Navigationsleiste zu der Seite hinzuzufügen, auf der ich sie benötigt habe. Grundsätzlich hatte ich eine Anmeldeseite, auf der ich mein Menü nicht einfügen wollte, also habe ich ngInclude verwendet und diese Anweisung eingefügt, wenn ich angemeldet war:
RICHTLINIE:
DIRECTIVE TEMPLATE (templates / menu.html)
HTML, DAS DIE RICHTLINIE ENTHÄLT
Hoffe das hilft
quelle
Um meine Antwort zu erweitern, brauchte ich dies, um mit einer solchen Struktur fertig zu werden.
-Index
-events <-active
--- event-list
--- event-edit
--- event-map <-clicked
-places
--- place-list
--- place-edit
--- place-map
Anstelle des Abgleichs musste ich indexOf verwenden, um untergeordnete Links zu validieren, die so formatiert sind, dass sie der Bedingung entsprechen. Also für 'Ereignisse':
quelle
Dies ist eine einfache Lösung
quelle
In Verbindung mit der AngularStrap-Antwort von @ Olivier habe ich auch die Antwort von kevinknelson implementiert: https://github.com/twbs/bootstrap/issues/9013 .
Die Bootstrap3-Navigationsleiste wurde ursprünglich nicht für eine Anwendung mit nur einer Seite (z. B. Angular) entwickelt, und daher wurde das Menü auf einem kleinen Bildschirm beim Klicken nicht reduziert.
quelle
JavaScript
HTML
quelle
Vielen Dank an @Pylinux . Ich habe seine Technik verwendet und sie auch modifiziert, um "eine" Ebene des Dropdown-Menüs (sub ul / li) zu unterstützen, da ich das brauchte. Sehen Sie es in Aktion im Geigen-Link unten.
Fiddle wurde basierend auf der Antwort von pylinux aktualisiert - http://jsfiddle.net/abhatia/en4qxw6g/
Ich habe die folgenden drei Änderungen vorgenommen, um ein Ebenen-Dropdown-Menü zu unterstützen:
1. Es wurde ein Klassenwert von dd (Dropdown) für "a" -Element unter li hinzugefügt, für das eine untergeordnete Liste erforderlich ist.
2. Javascript wurde aktualisiert, um die folgende neue Logik hinzuzufügen.
3. Aktualisiertes CSS, um Folgendes hinzuzufügen:
Hoffentlich ist dies hilfreich für jemanden, der ein einstufiges Dropdown-Menü implementieren möchte.
quelle
Verwenden Sie ein Objekt als Schaltvariable.
Sie können dies ganz einfach inline tun mit:
Jedes Mal, wenn Sie auf einen Link klicken, wird das Switch-Objekt durch ein neues Objekt ersetzt, bei dem nur die richtige Switch-Objekt-Eigenschaft wahr ist. Die undefinierten Eigenschaften werden als falsch ausgewertet, sodass den von ihnen abhängigen Elementen nicht die aktive Klasse zugewiesen wird.
quelle
Sie können diese Active-Link-Direktive auch verwenden https://stackoverflow.com/a/23138152/1387163 verwenden
Parent li erhält eine aktive Klasse, wenn der Standort mit / url übereinstimmt :
quelle
Ich schlage vor, eine Direktive für einen Link zu verwenden. Hier ist die Geige.
Aber es ist noch nicht perfekt. Pass auf die Hashbangs auf;)
Hier ist das Javascript für die Direktive:
und hier ist, wie es in HTML verwendet werden würde:
danach Styling mit CSS:
quelle
Um meine zwei Cent in die Debatte einzubeziehen, habe ich ein reines Winkelmodul (keine Abfrage) erstellt, das auch mit Hash-URLs funktioniert, die Daten enthalten. ( ig
#/this/is/path?this=is&some=data
)Sie fügen das Modul einfach als Abhängigkeit und
auto-active
zu einem der Vorfahren des Menüs hinzu. So was:Und das Modul sieht so aus:
* (Sie können natürlich auch nur den Direktiventeil verwenden)
** Es ist auch erwähnenswert, dass dies nicht für leere Hashes ( ig
example.com/#
oder nurexample.com
) funktioniert , die mindestensexample.com/#/
oder nur vorhanden sein müssenexample.com#/
. Dies geschieht jedoch automatisch mit ngResource und dergleichen.quelle
Das hat den Trick für mich getan:
Dann verwenden Sie jquery (funktioniert auch mit Angular), um eine aktive Klasse hinzuzufügen
und natürlich die css:
Dies funktioniert, wenn Sie Ihr HTML wie folgt haben:
Dadurch wird die aktive Klasse mithilfe der Seiten-URL hinzugefügt und der Hintergrund rot gefärbt, wenn Sie unter www.somesite.com/ee thaen ee die 'App' haben und diese aktiv ist
quelle
Dies ist lange beantwortet, aber ich dachte, ich würde meinen Weg teilen:
Vorlage:
Für diejenigen, die verwenden
ui-router
:Für eine genaue Übereinstimmung (z. B. verschachtelte Zustände?) Verwenden Sie
$state.name === 'full/path/to/state'
oderui-sref-active-eq="active"
quelle
Hier ist eine weitere Lösung für alle, die interessiert sein könnten. Dies hat den Vorteil, dass weniger Abhängigkeiten bestehen. Heck, es funktioniert auch ohne Webserver. Es ist also komplett clientseitig.
HTML:
Erläuterung:
Hier generieren wir die Links dynamisch aus einem Winkelmodell unter Verwendung der Direktive
ng-repeat
. Magie passiert mit den MethodenselectTab()
undgetTabClass()
in der Steuerung für diese navbar unten dargestellt definiert.Regler:
Erläuterung:
selectTab()
Methode wird mitng-click
Direktive aufgerufen . Wenn Sie also auf den Link klicken, wird die VariableselectedTab
auf den Namen dieses Links gesetzt. Im HTML-Code können Sie sehen, dass diese Methode ohne Argument für die Registerkarte "Startseite" aufgerufen wird, sodass sie beim Laden der Seite hervorgehoben wird.Die
getTabClass()
Methode wird über dieng-class
Direktive im HTML aufgerufen . Diese Methode prüft, ob die Registerkarte, in der sie sich befindet, mit dem Wert derselectedTab
Variablen übereinstimmt. Wenn true, wird "active" zurückgegeben, andernfalls wird "" zurückgegeben, was von derng-class
Direktive als Klassenname angewendet wird . Dann wird das CSS, das Sie auf die Klasseactive
angewendet haben, auf die ausgewählte Registerkarte angewendet.quelle
Sie müssen nur die erforderliche
active
Klasse mit dem erforderlichen Farbcode hinzufügen .Ex:
ng-class="{'active': currentNavSelected}" ng-click="setNav"
quelle