REMARQUE: Il existe de nombreuses réponses différentes ici, et la plupart ont été valides à un moment ou à un autre. Le fait est que ce qui fonctionne a changé un certain nombre de fois lorsque l'équipe Angular a changé son routeur. La version Router 3.0 qui sera finalement le routeur dans Angular casse bon nombre de ces solutions, mais offre une solution très simple qui lui est propre. Depuis RC.3, la solution préférée est d'utiliser [routerLinkActive]
comme indiqué dans cette réponse .
Dans une application angulaire (actuelle dans la version 2.0.0-beta.0 au moment où j'écris ceci), comment déterminez-vous la route actuellement active?
Je travaille sur une application qui utilise Bootstrap 4 et j'ai besoin d'un moyen de marquer les liens / boutons de navigation comme actifs lorsque leur composant associé est affiché dans une <router-output>
balise.
Je me rends compte que je pourrais maintenir l'état moi-même lorsque l'un des boutons est cliqué, mais cela ne couvrirait pas le cas d'avoir plusieurs chemins dans le même itinéraire (disons un menu de navigation principal ainsi qu'un menu local dans le composant principal ).
Toutes suggestions ou liens seraient appréciés. Merci.
la source
@input
option for, maisexact: false
active la classe chaque fois que les frères et sœurs de l'itinéraire actuel sont également actifs.router.navigate()
cela fonctionnerait très bien.routerLinkActive
est simplement un indicateur indiquant si ce lien représente l'itinéraire actif.J'ai répondu à cela dans une autre question, mais je pense que cela pourrait également être pertinent pour celle-ci. Voici un lien vers la réponse d'origine: Angular 2: Comment déterminer l'itinéraire actif avec des paramètres?
J'ai essayé de définir la classe active sans avoir à savoir exactement quel est l'emplacement actuel (en utilisant le nom de l'itinéraire) . La meilleure solution à laquelle je suis parvenu jusqu'à présent est d'utiliser la fonction isRouteActive disponible dans la
Router
classe.router.isRouteActive(instruction): Boolean
prend un paramètre qui est unInstruction
objet route et renvoietrue
oufalse
si cette instruction est vraie ou non pour la route actuelle. Vous pouvez générer un itinéraireInstruction
à l'aide deRouter
la commande generate (linkParams: Array) . LinkParams suit exactement le même format qu'une valeur passée dans une directive routerLink (par exemplerouter.isRouteActive(router.generate(['/User', { user: user.id }]))
).Voici à quoi pourrait ressembler RouteConfig (je l'ai légèrement modifié pour montrer l'utilisation des paramètres) :
Et la vue ressemblerait à ceci:
Jusqu'à présent, cela a été ma solution préférée pour le problème, cela pourrait également vous être utile.
la source
router.isRouteActive('Home')
.Router
dans le constructeur de la classename
plutôt queas
dans l'objet de configuration du routeur.router.urlTree.contains(router.createUrlTree(['Home']))
J'ai résolu un problème que j'ai rencontré dans ce lien et je découvre qu'il existe une solution simple à votre question. Vous pouvez utiliser à la
router-link-active
place dans vos styles.la source
router-link-active
classe n'est pas ajoutée à l'actifa
ouli
. mais il y a un endroit où j'utilise bootstrapnav-tabs
et cela fonctionne là-bas.Petite amélioration de la réponse @ alex-correia-santos basée sur https://github.com/angular/angular/pull/6407#issuecomment-190179875
Et utilisez-le comme ceci:
la source
styles : [
.active {background-color: aliceblue; }]
. +1 ça marcheVous pouvez vérifier l'itinéraire actuel en injectant l'
Location
objet dans votre contrôleur et en vérifiant lepath()
, comme ceci:Vous devrez vous assurer de l'importer d'abord:
Vous pouvez ensuite utiliser une expression régulière pour faire correspondre le chemin retourné pour voir quel itinéraire est actif. Notez que la
Location
classe renvoie un chemin normalisé quel que soit celui queLocationStrategy
vous utilisez. Donc , même si vous utilisez lesHashLocationStragegy
chemins retournés seront toujours de la forme/foo/bar
non#/foo/bar
la source
MISE À JOUR: mise à jour selon Angular2.4.x
voir plus ...
la source
Pour marquer les itinéraires actifs
routerLinkActive
peuvent être utilisésCela fonctionne également sur d'autres éléments comme
Si les correspondances partielles doivent également être marquées, utilisez
Pour autant que je sache, ce
exact: false
sera la valeur par défaut dans RC.4la source
En ce moment, j'utilise rc.4 avec bootstrap 4 et celui-ci fonctionne parfaitement pour moi:
Cela fonctionnera pour l'URL: / home
la source
/home/whatever
?exact
veux dire, cette route aura le même nom. Et cela est nécessaire si vous prévoyez de l'utiliser avec des outils comme Twitter Bootstrap. Il gère déjà l'état du lien actif et sansexact
option ne fonctionnera pas. (Je ne sais pas comment ça fonctionne en core, je l'ai essayé et ça marche pour moi)Vous trouverez ci-dessous la méthode utilisant RouteData pour styliser les éléments du menuBar en fonction de l'itinéraire actuel:
RouteConfig comprend des données avec onglet (itinéraire actuel):
Un morceau de mise en page:
Classe:
la source
Je pensais simplement ajouter un exemple qui n'utilise aucun dactylographe:
La
routerLinkActive
variable est liée à une variable de modèle, puis réutilisée selon les besoins. Malheureusement, la seule mise en garde est que vous ne pouvez pas tout avoir sur l'<section>
élément car cela#home
doit être résolu avant que l'analyseur ne frappe<section>
.la source
Router
dans Angular 2 RC ne définit plusisRouteActive
et lesgenerate
méthodes.Essayez de suivre
notice,
routeSegment : RouteSegment
doit être injecté dans le constructeur du composant.la source
Voici un exemple complet pour ajouter un style d'itinéraire actif dans la version angulaire
2.0.0-rc.1
qui prend en compte les chemins racine nuls (par exemplepath: '/'
)app.component.ts -> Itinéraires
app.component.html
la source
Solution pour Angular2 RC 4:
la source
Depuis Angular 8, cela fonctionne:
{ exact: true }
s'assure qu'il correspond à l'URL.la source
en 2020 si vous voulez définir la classe active sur l'élément qui n'a pas de [routerLink] - vous pouvez faire simplement:
la source
Une autre solution de contournement. Beaucoup plus facile dans Angular Router V3 Alpha. en injectant le routeur
usage
la source
Dans Angular2 RC2, vous pouvez utiliser cette implémentation simple
cela ajoutera une classe
active
à l'élément avec une URL correspondante, en savoir plus icila source
Vous trouverez ci-dessous les réponses à cette question pour toutes les versions des versions Angular 2 RC publiées jusqu'à ce jour:
RC4 et RC3 :
Pour appliquer la classe au lien ou l'ancêtre du lien:
/ home doit être l'URL et non le nom de la route car la propriété name n'existe plus sur Route Object à partir du routeur v3.
Plus d'informations sur la directive routerLinkActive sur ce lien .
Pour appliquer la classe à n'importe quel div basé sur l'itinéraire actuel:
par exemple
RC2 et RC1 :
Utilisez une combinaison de router.isRouteActive et class. *. Par exemple, pour appliquer la classe active sur la base de l'itinéraire d'origine.
Le nom et l'URL peuvent tous deux être transmis à router.generate.
la source
L'utilisation
routerLinkActive
est bonne dans les cas simples, lorsqu'il y a un lien et que vous souhaitez appliquer certaines classes. Mais dans des cas plus complexes où vous n'avez peut-être pas de routerLink ou où vous avez besoin de quelque chose de plus, vous pouvez créer et utiliser un canal :puis:
et n'oubliez pas d'inclure pipe dans les dépendances de pipes;)
la source
containsTree
défini?Pour la version angulaire 4+, vous n'avez pas besoin d'utiliser de solution complexe. Vous pouvez simplement utiliser
[routerLinkActive]="'is-active'"
.Pour un exemple avec bootstrap 4 nav link:
la source
Une instance de la classe Router est en fait un observable et renvoie le chemin actuel à chaque fois qu'elle change. Voici comment je le fais:
Et puis dans mon HTML:
la source
Comme mentionné dans l'un des commentaires de la réponse acceptée, la
routerLinkActive
directive peut également être appliquée à un conteneur de la<a>
balise réelle .Ainsi, par exemple, avec les onglets Twitter Bootstrap où la classe active doit être appliquée à la
<li>
balise qui contient le lien:Génial ! Je suppose que la directive inspecte le contenu de la balise et cherche une
<a>
balise avec larouterLink
directive.la source
Une solution simple pour les utilisateurs angulaires 5 est, il suffit d'ajouter
routerLinkActive
à l'élément de liste.Une
routerLinkActive
directive est associée à un itinéraire passant par unrouterLink
directive.Il prend en entrée un tableau de classes qu'il ajoutera à l'élément auquel il est attaché si sa route est actuellement active, comme ceci:
Ce qui précède ajoutera une classe d'actifs à la balise d'ancrage si nous visualisons actuellement l'itinéraire d'origine.
la source
Et dans la dernière version d'angular, vous pouvez simplement vérifier
router.isActive(routeNameAsString)
. Par exemple, voir l'exemple ci-dessous:Et assurez-vous de ne pas oublier d'injecter un routeur dans votre composant.
la source
Je cherchais un moyen d'utiliser une navigation de style Twitter Bootstrap avec Angular2, mais j'ai eu du mal à obtenir le
active
appliquer classe à l'élément parent du lien sélectionné. J'ai trouvé que la solution de @ alex-correia-santos fonctionne parfaitement!Le composant contenant vos onglets doit importer le routeur et le définir dans son constructeur avant de pouvoir effectuer les appels nécessaires.
Voici une version simplifiée de mon implémentation ...
la source
disons que vous voulez ajouter du CSS à mon état / onglet actif. Utilisez routerLinkActive pour activer votre lien de routage.
note: «actif» est mon nom de classe ici
la source
J'utilise un routeur angulaire
^3.4.7
et j'ai toujours des problèmes avec larouterLinkActive
directive.Cela ne fonctionne pas si vous disposez de plusieurs liens avec la même URL et qu'il ne semble pas être actualisé tout le temps.
Inspiré par la réponse de @tomaszbak, j'ai créé un petit composant pour faire le travail
la source
Le modèle HTML pur est comme
la source
commencez par importer RouterLinkActive dans votre .ts
Utilisez maintenant RouterLinkActive dans votre code HTML
fournir quelques css à la classe "class_Name", car lorsque ce lien sera actif / cliqué, vous trouverez cette classe sur span lors de l'inspection.
la source
Une manière programmatique serait de le faire dans le composant lui-même. J'ai lutté trois semaines sur ce problème, mais j'ai abandonné les documents angulaires et j'ai lu le code réel qui a fait fonctionner routerlinkactive et c'est à propos des meilleurs documents que je puisse trouver.
Remarque :
Pour la manière programmatique, assurez-vous d'ajouter le routeur-lien et il faut un élément enfant. Si vous voulez changer cela, vous devez vous débarrasser des enfants
superclass.nativeElement
.la source