Hilft AngularJS in irgendeiner Weise beim Festlegen einer active
Klasse für den Link für die aktuelle Seite?
Ich stelle mir vor, dass dies auf magische Weise geschieht, aber ich kann es nicht finden.
Mein Menü sieht aus wie:
<ul>
<li><a class="active" href="/tasks">Tasks</a>
<li><a href="/actions">Tasks</a>
</ul>
und ich habe Controller für jeden von ihnen in meinen Routen: TasksController
und ActionsController
.
Aber ich kann keine Möglichkeit finden, die "aktive" Klasse an die a
Links zu den Controllern zu binden .
Irgendwelche Hinweise?
ngClass="{active: isActive('/tasks')}
, beiisActive()
der ein Boolescher Wert zurückgegeben wird, da er den Controller und das Markup / Styling entkoppelt.Ich schlage vor, eine Direktive für einen Link zu verwenden.
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
var path = $(element).children("a")[0].hash.substring(1);
. Dies wird für einen Stil wie<li active-link="active"><a href="#/dashboard">Dashboard</a></li>
scope.$watch('location.path()', function(newPath) {
fürscope.$on('$locationChangeStart', function(){
.var path = attrs.href;
zuvar path = attrs.href||attrs.ngHref;
<li>
, können Sieelement.addClass(clazz);
zuelement.parent().addClass(clazz);
Hier ist ein einfacher Ansatz, der gut mit Angular funktioniert.
In Ihrem AngularJS-Controller:
Dieser Thread hat eine Reihe anderer ähnlicher Antworten.
Wie setze ich die aktive Klasse der Bootstrap-Navigationsleiste mit Angular JS?
quelle
return viewLocation === $location.path()
Um meine zwei Cent in die Debatte einzubeziehen, habe ich ein reines Winkelmodul (kein jQuery) erstellt, das auch mit Hash-URLs funktioniert, die Daten enthalten. (z.B
#/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 Direktiven-Teil verwenden)
Es ist auch erwähnenswert, dass dies nicht für leere Hashes (z. B.
example.com/#
oder nurexample.com
) funktioniert , die mindestensexample.com/#/
oder nur vorhanden sein müssenexample.com#/
. Dies geschieht jedoch automatisch mit ngResource und dergleichen.Und hier ist die Geige: http://jsfiddle.net/gy2an/8/
quelle
In meinem Fall habe ich dieses Problem gelöst, indem ich einen einfachen Controller erstellt habe, der für die Navigation verantwortlich ist
Und indem Sie dem Element einfach die folgende ng-Klasse hinzufügen:
quelle
Für AngularUI Router-Benutzer:
Dadurch wird eine
active
Klasse für das ausgewählte Objekt platziert.quelle
Da ist ein
ng-class
Direktive, die Variable und CSS-Klasse bindet. Es akzeptiert auch das Objekt (className vs bool value pair).Hier ist das Beispiel http://plnkr.co/edit/SWZAqj
quelle
/test1/blahblah
oder?active: activePath=='/test1'
automatisch ein "aktiver" Pfad zurückgegeben wird, der mit der angegebenen Zeichenfolge beginnt? Ist dies eine Art vordefinierter Operator oder Regex?==
Überprüfungen im HTML.Die Antwort von @ Renan-tomal-fernandes ist gut, aber es waren einige Verbesserungen erforderlich, um richtig zu funktionieren. So wie es war, wurde der Link zur Startseite (/) immer als ausgelöst erkannt, selbst wenn Sie sich in einem anderen Abschnitt befanden.
Also habe ich es ein bisschen verbessert, hier ist der Code. Ich arbeite mit Bootstrap, also befindet sich der aktive Teil im
<li>
Element anstelle des<a>
.Regler
Vorlage
quelle
Hier ist die Lösung, die ich gefunden habe, nachdem ich einige der oben genannten hervorragenden Vorschläge gelesen habe. In meiner speziellen Situation habe ich versucht, die Bootstrap-Registerkartenkomponente als Menü zu verwenden, wollte jedoch nicht die Angular-UI-Version davon verwenden, da die Registerkarten als Menü fungieren sollen, in dem jede Registerkarte mit Lesezeichen versehen werden kann. anstatt der Registerkarten, die als Navigation für eine einzelne Seite dienen. (Siehe http://angular-ui.github.io/bootstrap/#/tabs, wenn Sie daran interessiert sind, wie die Angular-UI-Version von Bootstrap-Registerkarten aussieht.)
Die Antwort von kfis, eine eigene Direktive zu erstellen, um dies zu handhaben, hat mir sehr gut gefallen, aber es schien umständlich, eine Direktive zu haben, die auf jedem einzelnen Link platziert werden musste. Also habe ich meine eigene Angular-Direktive erstellt, die stattdessen einmal auf der platziert wird
ul
. Nur für den Fall, dass jemand anderes versucht, dasselbe zu tun, dachte ich, ich würde es hier posten, obwohl, wie gesagt, viele der oben genannten Lösungen auch funktionieren. Dies ist eine etwas komplexere Lösung, was das Javascript betrifft, aber es wird eine wiederverwendbare Komponente mit minimalem Markup erstellt.Hier ist das Javascript für die Richtlinie und der Routenanbieter für
ng:view
:Dann in Ihrem HTML Sie einfach:
Hier ist der Plunker dafür: http://plnkr.co/edit/xwGtGqrT7kWoCKnGDHYN?p=preview .
quelle
Sie können dies sehr einfach implementieren, hier ein Beispiel:
Und Ihr Controller sollte dies sein:
quelle
Verwenden Sie die ui-sref-active-Direktive des Angular-UI-Routers https://github.com/angular-ui/ui-router/wiki/Quick-Reference#statename
quelle
Ich hatte ein ähnliches Problem mit dem Menü außerhalb des Controller-Bereichs. Ich bin mir nicht sicher, ob dies die beste oder eine empfohlene Lösung ist, aber das hat bei mir funktioniert. Ich habe meiner App-Konfiguration Folgendes hinzugefügt:
Dann habe ich in der Ansicht:
quelle
Verwenden von Angular Version 6 mit Bootstrap 4.1
Ich konnte es wie unten gezeigt erledigen.
Wenn im folgenden Beispiel die URL "/ contact" anzeigt, wird der aktive Bootstrap zum HTML-Tag hinzugefügt. Wenn sich die URL ändert, wird sie entfernt.
Lesen Sie mehr auf der Angular-Website
quelle
Unter Verwendung einer Direktive (da wir hier DOM-Manipulationen durchführen) ist das Folgende wahrscheinlich am nächsten daran, Dinge auf "eckige Weise" zu tun:
Dann würde Ihr HTML wie folgt aussehen:
quelle
menu-item
aber in jeder Zeile überflüssig. Vielleicht wäre es besser, ein Attribut an einul
Element anzuhängen (z. B.<ul menu>
), aber ich bin mir nicht sicher, ob dies möglich wäre.Ich habe es so gemacht:
Auf diese Weise können Sie Links in einem Abschnitt mit einer Track-Active-Direktive haben:
Dieser Ansatz scheint mir viel sauberer als andere.
Wenn Sie jQuery verwenden, können Sie es auch viel übersichtlicher gestalten, da jQlite nur grundlegende Selektorunterstützung bietet. Eine viel sauberere Version mit JQuery vor Angular Include würde folgendermaßen aussehen:
Hier ist eine jsFiddle
quelle
Meine Lösung für dieses Problem verwenden Sie
route.current
in der Winkelschablone.Da Sie die
/tasks
Route in Ihrem Menü hervorheben müssen, können SiemenuItem
den von Ihrem Modul deklarierten Routen Ihre eigene Eigenschaft hinzufügen :Dann können Sie in Ihrer Vorlage
tasks.html
folgendeng-class
Anweisung verwenden:Meiner Meinung nach ist dies viel sauberer als alle vorgeschlagenen Lösungen.
quelle
Hier ist eine Erweiterung der kfis-Direktive, die ich gemacht habe, um verschiedene Ebenen der Pfadanpassung zu ermöglichen. Im Wesentlichen stellte ich fest, dass URL-Pfade bis zu einer bestimmten Tiefe abgeglichen werden müssen, da eine genaue Übereinstimmung keine Verschachtelung und Standardstatusumleitungen zulässt. Hoffe das hilft.
Und so benutze ich den Link
Diese Direktive entspricht der im Attributwert für die Direktive angegebenen Tiefenstufe. Bedeutet nur, dass es um ein Vielfaches an anderer Stelle verwendet werden kann.
quelle
Hier ist noch eine weitere Anweisung, um aktive Links hervorzuheben.
Hauptmerkmale:
Code:
Verwendung:
Ein einfaches Beispiel mit einem Winkelausdruck, sagen wir $ scope.var = 2 , dann ist der Link aktiv, wenn der Speicherort / url / 2 ist :
Bootstrap-Beispiel, Eltern-Li erhält aktive Klasse:
Beispiel mit verschachtelten URLs: Der Link ist aktiv, wenn eine verschachtelte URL aktiv ist (z. B. / url / 1 , / url / 2 , url / 1/2 / ... ).
Komplexes Beispiel: Link verweist auf eine URL ( / url1 ), ist jedoch aktiv, wenn eine andere ausgewählt ist ( / url2 ):
Beispiel mit deaktiviertem Link: Wenn er nicht aktiv ist, hat er die Klasse 'disabled' :
Alle Active-Link- * -Attribute können in beliebiger Kombination verwendet werden, sodass sehr komplexe Bedingungen implementiert werden können.
quelle
Wenn Sie die Links für die Direktive in einem Wrapper haben möchten, anstatt jeden einzelnen Link auszuwählen (erleichtert das Betrachten des Bereichs in Batarang), funktioniert dies auch ziemlich gut:
Markup wäre nur:
Ich sollte auch erwähnen, dass ich in diesem Beispiel 'vollfettes' jQuery verwende, aber Sie können leicht ändern, was ich mit der Filterung gemacht habe und so weiter.
quelle
Hier sind meine zwei Cent, das funktioniert gut.
HINWEIS: Dies stimmt nicht mit den Kinderseiten überein (was ich brauchte).
Aussicht:
Regler:
quelle
Laut der Antwort von @kfis sind es Kommentare und meine Empfehlung, die endgültige Richtlinie wie folgt:
quelle
Für diejenigen, die einen UI-Router verwenden, ist meine Antwort etwas ähnlich wie die von Ender2050, aber ich bevorzuge dies über das Testen des Statusnamens:
entsprechender HTML:
quelle
Keiner der oben genannten Richtlinienvorschläge war für mich nützlich. Wenn Sie eine Bootstrap-Navigationsleiste wie diese haben
(das könnte ein
$ yo angular
Start sein) Dann möchten Sie.active
der Liste der übergeordneten<li>
Elementklassen hinzufügen , nicht dem Element selbst; dh<li class="active">..</li>
. Also habe ich folgendes geschrieben:Nutzung
set-parent-active
;.active
ist die Standardeinstellung, muss also nicht eingestellt werdenund das übergeordnete
<li>
Element ist,.active
wenn der Link aktiv ist. Um eine alternative.active
Klasse wie.highlight
einfach zu verwendenquelle
Für mich war es am wichtigsten, den Bootstrap-Standardcode überhaupt nicht zu ändern. Hier ist es mein Menü-Controller, der nach Menüoptionen sucht und dann das gewünschte Verhalten hinzufügt.
quelle
hatte das gleiche Problem. Hier ist meine Lösung :
quelle
Ich habe gerade eine Anweisung dafür geschrieben.
Verwendung:
Implementierung:
Tests:
quelle
Die Route:
Das Menü HTML:
Der Controller:
Das Problem, das ich hier gefunden habe, ist, dass der Menüpunkt nur aktiv ist, wenn die ganze Seite geladen ist. Wenn die Teilansicht geladen ist, ändert sich das Menü nicht. Weiß jemand warum es passiert?
quelle
quelle
Ich habe die einfachste Lösung gefunden. Nur um indexOf in HTML zu vergleichen
quelle