Si j'ai une barre de navigation en bootstrap avec les articles
Home | About | Contact
Comment définir la classe active pour chaque élément de menu lorsqu'ils sont actifs? Autrement dit, comment puis-je définir class="active"
lorsque la route angulaire est à
#/
Pour la maison#/about
pour la page à propos#/contact
pour la page contact
Réponses:
Une manière très élégante consiste à utiliser ng-controller pour exécuter un seul contrôleur en dehors de la vue ng:
et inclure dans controllers.js:
la source
return $location.path().indexOf(viewLocation) == 0;
place pour que vous puissiez également attraper des pages avec des paramètreselegant
- le nom de la route, par exemple,/dogs
doit être dupliqué dans l'appel àisActive('/dogs')
ui-sref-active/ui-sref-active-eq
directives, c'est-à-dire.ui-sref-active-eq='active'
ouui-sref-active='active'
pour obtenir les mêmes résultatsJe viens d'écrire une directive pour gérer cela, vous pouvez donc simplement ajouter l'attribut
bs-active-link
à l'<ul>
élément parent , et chaque fois que la route changera, il trouvera le lien correspondant et ajoutera laactive
classe au correspondant<li>
.Vous pouvez le voir en action ici: http://jsfiddle.net/8mcedv3b/
Exemple HTML:
Javascript:
la source
Vous pouvez jeter un œil à AngularStrap , la directive navbar semble être ce que vous cherchez:
https://github.com/mgcrea/angular-strap/blob/master/src/navbar/navbar.js
Pour utiliser cette directive:
Téléchargez AngularStrap depuis http://mgcrea.github.io/angular-strap/
Incluez le script sur votre page après bootstrap.js:
<script src="lib/angular-strap.js"></script>
Ajoutez les directives à votre module:
angular.module('myApp', ['$strap.directives'])
Ajoutez la directive à votre barre de navigation:
<div class="navbar" bs-navbar>
Ajoutez des expressions régulières sur chaque élément de navigation:
<li data-match-route="/about"><a href="#/about">About</a></li>
la source
scope.$watch
)element
variable est-elle transmise au sélecteur jquery?$('...', element)
mgcrea.ngStrap
pas$strap.directives
Voici une approche simple qui fonctionne bien avec Angular.
Au sein de votre contrôleur AngularJS:
la source
Si vous travaillez avec un routeur angulaire, la directive RouterLinkActive peut être utilisée de manière très élégante:
la source
active
classe devrait être dans le<li>
(vous pouvez mettre routerLinkActive avec routerLink ou son parent)/
comme votre page d'accueil,routerLinkActive
considérera que actif pour toute URL commençant par/
, par exemple/foo/
,/foo/bar
etc. Pour correspondre exactement, vous avez besoinrouterLinkActive="active" [routerLinkActiveOptions]="{exact:true}"
.Tout d'abord, ce problème peut être résolu de nombreuses façons. Cette voie n'est peut-être pas la plus élégante, mais elle fonctionne toujours.
Voici une solution simple que vous devriez pouvoir ajouter à n'importe quel projet. Vous pouvez simplement ajouter une "pageKey" ou une autre propriété lorsque vous configurez votre itinéraire que vous pouvez utiliser pour vous déconnecter. En outre, vous pouvez implémenter un écouteur sur la méthode $ routeChangeSuccess de l'objet $ route pour écouter la réussite d'une modification de route.
Lorsque votre gestionnaire se déclenche, vous obtenez la clé de page et utilisez cette clé pour localiser les éléments qui doivent être «ACTIFS» pour cette page et vous appliquez la classe ACTIVE.
Gardez à l'esprit que vous avez besoin d'un moyen de rendre TOUS les éléments "EN ACTIVITÉ". Comme vous pouvez le voir, j'utilise la classe .pageKey sur mes éléments de navigation pour les désactiver tous, et j'utilise le .pageKey_ {PAGEKEY} pour les activer individuellement. Les passer tous à inactifs serait considéré comme une approche naïve, vous obtiendriez potentiellement de meilleures performances en utilisant la route précédente pour ne rendre inactifs que les éléments actifs, ou vous pourriez modifier le sélecteur jquery pour sélectionner uniquement les éléments actifs à rendre inactifs. L'utilisation de jquery pour sélectionner tous les éléments actifs est probablement la meilleure solution car elle garantit que tout est nettoyé pour l'itinéraire actuel en cas de bogues CSS qui pourraient avoir été présents sur l'itinéraire précédent.
Ce qui signifierait changer cette ligne de code:
à celui-ci
Voici un exemple de code:
Étant donné une barre de navigation bootstrap de
Et un module angulaire et un contrôleur comme celui-ci:
la source
Vous pouvez réellement utiliser la directive angular-ui-utils
ui-route
:ou:
Contrôleur d'en-tête
Sommaire
Si vous utilisez ui-utils, vous pouvez également être intéressé par ui-router pour gérer les vues partielles / imbriquées.
la source
Je trouve toutes ces réponses un peu trop compliquées pour moi, désolé. J'ai donc créé une petite directive qui devrait fonctionner par barre de navigation:
Usage:
la source
J'utilise la directive ng-class avec $ location pour y parvenir.
Il nécessite que la barre de navigation soit à l'intérieur d'un contrôleur principal avec accès au service $ location comme ceci:
la source
Vous pouvez y parvenir avec un conditionnel dans une expression angulaire, tel que:
Cela étant dit, je trouve qu'une directive angulaire est la façon la plus "appropriée" de le faire, même si l'externalisation d'une grande partie de cette mini-logique peut quelque peu polluer votre base de code.
J'utilise des conditions pour le style GUI de temps en temps pendant le développement, car c'est un peu plus rapide que la création de directives. Je ne pourrais pas vous dire cependant une instance dans laquelle ils sont restés dans la base de code pendant longtemps. En fin de compte, je la transforme en directive ou je trouve un meilleur moyen de résoudre le problème.
la source
Si vous utilisez ui-router , l'exemple suivant devrait satisfaire vos besoins en fonction du commentaire de @ DanPantry sur la réponse acceptée sans ajouter de code côté contrôleur:
Vous pouvez consulter la documentation pour plus d'informations à ce sujet.
la source
ui.router
!Si vous préférez ne pas utiliser AngularStrap, cette directive devrait faire l'affaire!. Il s'agit d'une modification de https://stackoverflow.com/a/16231859/910764 .
Javascript
HTML
Remarque: Les classes HTML ci-dessus supposent que vous utilisez Bootstrap 3.x
la source
Voici ma façon de voir les choses. Un peu d'une combinaison de réponses trouvées sur ce post. J'avais un cas légèrement différent, donc ma solution consiste à séparer le menu dans son propre modèle à utiliser dans la définition de directive Ojbect, puis à ajouter ma barre de navigation à la page sur laquelle j'en avais besoin. Fondamentalement, j'avais une page de connexion sur laquelle je ne voulais pas inclure mon menu, j'ai donc utilisé ngInclude et inséré cette directive lors de la connexion:
DIRECTIF:
MODÈLE DE DIRECTIVE (templates / menu.html)
HTML QUI COMPREND LA DIRECTIVE
J'espère que cela t'aides
la source
En étendant la réponse myl, j'avais besoin de cela pour gérer une structure comme celle-ci.
-indice
-events <-active
--- liste- d'événements --- édition-
événement
--- carte-événement <-cliqué
-places
--- place-list
--- place-edit
--- place-map
donc au lieu de correspondre, j'ai dû utiliser indexOf, afin de valider les liens enfants qui sont formatés pour correspondre à la condition. Donc pour les «événements»:
la source
Ceci est une solution simple
la source
En conjonction avec la réponse AngularStrap de @ Olivier, j'ai également implémenté la réponse de kevinknelson à partir de: https://github.com/twbs/bootstrap/issues/9013 .
De manière native, la barre de navigation Bootstrap3 n'était pas conçue pour une application d'une seule page (par exemple angulaire) et donc le menu sur un petit écran ne s'effondrait pas au clic.
la source
Javascript
HTML
la source
Merci à @Pylinux . J'ai utilisé sa technique et l'ai également modifiée pour prendre en charge "un" niveau de menu déroulant (sub ul / li), car c'est ce dont j'avais besoin. Voyez-le en action dans le lien violon ci-dessous.
Mise à jour de Fiddle basée sur la réponse de pylinux - http://jsfiddle.net/abhatia/en4qxw6g/
J'ai apporté les trois changements suivants, afin de prendre en charge un menu déroulant d'un niveau:
1. Ajout d'une valeur de classe dd (liste déroulante) pour l'élément "a" sous li qui doit avoir une liste sub ul.
2. Javascript mis à jour pour ajouter la nouvelle logique suivante.
3. CSS mis à jour pour ajouter ce qui suit:
J'espère que cela sera utile à quelqu'un qui cherche à implémenter un menu déroulant à un seul niveau.
la source
Utilisez un objet comme variable de commutation.
Vous pouvez le faire en ligne tout simplement avec:
Chaque fois que vous cliquez sur un lien, l'objet commutateur est remplacé par un nouvel objet dans lequel seule la propriété d'objet commutateur correcte est vraie. Les propriétés non définies seront évaluées comme fausses et donc les éléments qui en dépendent n'auront pas la classe active assignée.
la source
Vous pouvez également utiliser cette directive de lien actif https://stackoverflow.com/a/23138152/1387163
Le parent li obtiendra la classe active lorsque l'emplacement correspond à / url :
la source
Je suggère d'utiliser une directive sur un lien. Voici le violon.
Mais ce n'est pas encore parfait. Attention aux hashbangs;)
Voici le javascript pour la directive:
et voici comment il serait utilisé en html:
après styling avec css:
la source
Juste pour ajouter mes deux cents dans le débat, j'ai créé un module angulaire pur (pas de jquery), et il fonctionnera également avec des URL de hachage contenant des données. ( ig
#/this/is/path?this=is&some=data
)Vous venez d'ajouter le module en tant que dépendance et
auto-active
à l'un des ancêtres du menu. Comme ça:Et le module ressemble à ceci:
* (Vous pouvez bien sûr simplement utiliser la partie directive)
** Il convient également de noter que cela ne fonctionne pas pour les hachages vides ( ig
example.com/#
ou simplementexample.com
) qu'il doit avoir au moinsexample.com/#/
ou justeexample.com#/
. Mais cela se produit automatiquement avec ngResource et similaires.la source
Cela a fait l'affaire pour moi:
puis vous utilisez jquery (fonctionne également avec angular) pour ajouter la classe active
et bien sûr le css:
cela fonctionne si vous avez votre html comme ceci:
cela ajoutera atumatiquement la classe active en utilisant l'url de la page et colorera votre arrière-plan en rouge si vous êtes sur www.somesite.com/ee thaen ee est "l'application" et elle sera active
la source
C'est une réponse longue mais j'ai pensé partager mon chemin:
Modèle:
Pour ceux qui utilisent
ui-router
:Pour une correspondance exacte (par exemple, des états imbriqués?), Utilisez
$state.name === 'full/path/to/state'
ouui-sref-active-eq="active"
la source
Voici une autre solution pour tous ceux qui pourraient être intéressés. L'avantage de cela est qu'il a moins de dépendances. Heck, cela fonctionne aussi sans serveur web. C'est donc complètement côté client.
HTML:
Explication:
Ici, nous générons les liens dynamiquement à partir d'un modèle angularjs en utilisant la directive
ng-repeat
. La magie opère avec les méthodesselectTab()
etgetTabClass()
définies dans le contrôleur pour cette barre de navigation présentée ci-dessous.Manette:
Explication:
selectTab()
est appelée en utilisant lang-click
directive. Ainsi, lorsque le lien est cliqué, la variableselectedTab
est définie sur le nom de ce lien. Dans le code HTML, vous pouvez voir que cette méthode est appelée sans aucun argument pour l'onglet Accueil afin qu'elle soit mise en surbrillance lors du chargement de la page.La
getTabClass()
méthode est appelée viang-class
directive dans le HTML. Cette méthode vérifie si l'onglet dans lequel elle se trouve est identique à la valeur de laselectedTab
variable. Si vrai, il retourne "actif" sinon retourne "" qui est appliqué comme nom de classe parng-class
directive. Ensuite, tout css que vous avez appliqué à la classeactive
sera appliqué à l'onglet sélectionné.la source
Il vous suffit d'ajouter la
active
classe requise avec le code de couleur requis.Ex:
ng-class="{'active': currentNavSelected}" ng-click="setNav"
la source