AngularJS aide-t-il de quelque manière que ce soit à définir une active
classe sur le lien de la page actuelle?
J'imagine qu'il y a une façon magique de procéder, mais je n'arrive pas à trouver.
Mon menu ressemble à:
<ul>
<li><a class="active" href="/tasks">Tasks</a>
<li><a href="/actions">Tasks</a>
</ul>
et j'ai des contrôleurs pour chacun d'eux dans mes itinéraires: TasksController
et ActionsController
.
Mais je ne peux pas trouver un moyen de lier la classe "active" sur les a
liens vers les contrôleurs.
Des indices?
ngClass="{active: isActive('/tasks')}
, oùisActive()
retournerait un booléen car il dissocie le contrôleur et le balisage / style.Je suggère d'utiliser une directive sur un lien.
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
var path = $(element).children("a")[0].hash.substring(1);
. Cela fonctionnera pour un style comme<li active-link="active"><a href="#/dashboard">Dashboard</a></li>
scope.$watch('location.path()', function(newPath) {
pourscope.$on('$locationChangeStart', function(){
.var path = attrs.href;
envar path = attrs.href||attrs.ngHref;
<li>
, vous pouvez passerelement.addClass(clazz);
àelement.parent().addClass(clazz);
Voici une approche simple qui fonctionne bien avec Angular.
Au sein de votre contrôleur AngularJS:
Ce fil a un certain nombre d'autres réponses similaires.
Comment définir la classe active bootstrap navbar avec Angular JS?
la source
return viewLocation === $location.path()
Juste pour ajouter mes deux cents dans le débat, j'ai créé un module purement angulaire (pas de jQuery), et il fonctionnera également avec des URL de hachage contenant des données. (par exemple
#/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 (par exemple
example.com/#
ou tout simplementexample.com
) qu'il doit avoir au moinsexample.com/#/
ou justeexample.com#/
. Mais cela se produit automatiquement avec ngResource et similaires.Et voici le violon: http://jsfiddle.net/gy2an/8/
la source
Dans mon cas, j'ai résolu ce problème en créant un simple contrôleur responsable de la navigation
Et en ajoutant simplement ng-class à l'élément comme ceci:
la source
Pour les utilisateurs du routeur AngularUI :
Et cela placera une
active
classe sur l'objet sélectionné.la source
Il y a un
ng-class
directive qui lie la variable et la classe css. Il accepte également l'objet (nom de classe vs paires de valeurs booléennes).Voici l'exemple, http://plnkr.co/edit/SWZAqj
la source
/test1/blahblah
ou sera-ce?active: activePath=='/test1'
renvoie automatiquement un "actif" si le chemin commence par la chaîne donnée? Est-ce une sorte d'opérateur prédéfini ou d'expression régulière?==
contrôles répétés en html.La réponse de @ Renan-tomal-fernandes est bonne, mais avait besoin de quelques améliorations pour fonctionner correctement. En l'état, il détectait toujours le lien vers la page d'accueil (/) comme déclenché, même si vous étiez dans une autre section.
Je l'ai donc un peu amélioré, voici le code. Je travaille avec Bootstrap donc la partie active est dans l'
<li>
élément au lieu du<a>
.Manette
Modèle
la source
Voici la solution que j'ai trouvée après avoir lu certaines des excellentes suggestions ci-dessus. Dans ma situation particulière, j'essayais d'utiliser le composant d'onglets Bootstrap comme menu, mais je ne voulais pas utiliser la version Angular-UI de cela parce que je voulais que les onglets agissent comme un menu, où chaque onglet est capable de créer des signets, plutôt que les onglets servant de navigation pour une seule page. (Voir http://angular-ui.github.io/bootstrap/#/tabs si vous êtes intéressé par ce à quoi ressemble la version Angular-UI des onglets de bootstrap).
J'ai vraiment aimé la réponse de kfis à propos de la création de votre propre directive pour gérer cela, mais il semblait difficile d'avoir une directive qui devait être placée sur chaque lien. J'ai donc créé ma propre directive angulaire qui est placée à la place une fois sur le
ul
. Juste au cas où quelqu'un d'autre essaie de faire la même chose, je pensais que je le posterais ici, bien que, comme je l'ai dit, la plupart des solutions ci-dessus fonctionnent également. Il s'agit d'une solution légèrement plus complexe en ce qui concerne le javascript, mais elle crée un composant réutilisable avec un balisage minimal.Voici le javascript de la directive et le fournisseur d'itinéraire pour
ng:view
:Ensuite, dans votre html, vous simplement:
Voici le plongeur pour cela: http://plnkr.co/edit/xwGtGqrT7kWoCKnGDHYN?p=preview .
la source
Vous pouvez l'implémenter très simplement, voici un exemple:
Et votre contrôleur devrait être le suivant:
la source
utilisez la directive ui-sref-active de angular-ui-router https://github.com/angular-ui/ui-router/wiki/Quick-Reference#statename
la source
J'ai eu un problème similaire avec le menu situé en dehors de la portée du contrôleur. Je ne sais pas si c'est la meilleure solution ou une solution recommandée, mais c'est ce qui a fonctionné pour moi. J'ai ajouté ce qui suit à la configuration de mon application:
Ensuite, dans la vue, j'ai:
la source
Utilisation d'Angular Version 6 avec Bootstrap 4.1
J'ai pu le faire comme indiqué ci-dessous.
Dans l'exemple ci-dessous, lorsque l'URL voit «/ contact», le bootstrap actif est alors ajouté à la balise html. Lorsque l'URL change, elle est ensuite supprimée.
En savoir plus sur le site angulaire
la source
En utilisant une directive (puisque nous faisons ici une manipulation DOM), ce qui suit est probablement le plus proche de faire les choses de la "manière angulaire":
Votre code HTML ressemblerait alors à:
la source
menu-item
semble redondant sur chaque ligne. Il serait peut-être préférable d' attacher un attribut à unul
élément (par exemple<ul menu>
), mais je ne suis pas sûr que ce soit possible.Je l'ai fait comme ça:
Cela vous permet d'avoir des liens dans une section qui a une directive track-active:
Cette approche me semble beaucoup plus propre que les autres.
De plus, si vous utilisez jQuery, vous pouvez le rendre beaucoup plus net car jQlite ne prend en charge que le sélecteur de base. Une version beaucoup plus propre avec jquery inclus avant l'inclusion angulaire ressemblerait à ceci:
Voici un jsFiddle
la source
Ma solution à ce problème, utilisez
route.current
dans le modèle angulaire.Comme vous avez l'
/tasks
itinéraire à mettre en évidence dans votre menu, vous pouvez ajouter votre propre propriétémenuItem
aux itinéraires déclarés par votre module:Ensuite, dans votre modèle,
tasks.html
vous pouvez utiliser lang-class
directive suivante :À mon avis, c'est beaucoup plus propre que toutes les solutions proposées.
la source
Voici une extension de la directive kfis que j'ai faite pour permettre différents niveaux de correspondance de chemin. Essentiellement, j'ai trouvé la nécessité de faire correspondre les chemins d'URL jusqu'à une certaine profondeur, car la correspondance exacte ne permet pas l'imbrication et les redirections d'état par défaut. J'espère que cela t'aides.
Et voici comment j'utilise le lien
Cette directive correspondra au niveau de profondeur spécifié dans la valeur d'attribut de la directive. Cela signifie simplement qu'il peut être utilisé ailleurs plusieurs fois.
la source
Voici encore une autre directive pour mettre en évidence les liens actifs.
Principales caractéristiques:
Code:
Usage:
Exemple simple avec une expression angulaire, disons $ scope.var = 2 , alors le lien sera actif si l'emplacement est / url / 2 :
Exemple d'amorçage, parent li obtiendra la classe active:
Exemple avec des URL imbriquées, le lien sera actif si une URL imbriquée est active (ie / url / 1 , / url / 2 , url / 1/2 / ... )
Exemple complexe, le lien pointe vers une URL ( / url1 ) mais sera actif si une autre est sélectionnée ( / url2 ):
Exemple avec lien désactivé, s'il n'est pas actif, il aura la classe 'désactivé' :
Tous les attributs active-link- * peuvent être utilisés dans n'importe quelle combinaison, de sorte que des conditions très complexes pourraient être implémentées.
la source
Si vous voulez les liens pour la directive dans un wrapper plutôt que de sélectionner chaque lien individuel (facilite la recherche de la portée dans Batarang), cela fonctionne assez bien aussi:
Le balisage serait simplement:
Je dois également mentionner que j'utilise jQuery «full-fat» dans cet exemple, mais vous pouvez facilement modifier ce que j'ai fait avec le filtrage, etc.
la source
Voici mes deux cents, cela fonctionne très bien.
REMARQUE: cela ne correspond pas aux pages enfants (ce dont j'avais besoin).
Vue:
Manette:
la source
Selon la réponse de @kfis, ce sont des commentaires, et ma recommandation, la directive finale comme ci-dessous:
la source
Pour ceux qui utilisent ui-router, ma réponse est quelque peu similaire à celle d'Ender2050, mais je préfère le faire via un test de nom d'état:
HTML correspondant:
la source
Aucune des suggestions de directive ci-dessus ne m'a été utile. Si vous avez une barre de navigation bootstrap comme celle-ci
(qui pourrait être une
$ yo angular
startup), vous voulez ajouter.active
à la liste de classes d'élément parent<li>
, pas à l'élément lui-même; ie<li class="active">..</li>
. J'ai donc écrit ceci:utilisation
set-parent-active
;.active
est par défaut, il n'est donc pas nécessaire de le définiret l'
<li>
élément parent sera.active
lorsque le lien sera actif. Pour utiliser une.active
classe alternative comme.highlight
, simplementla source
Le plus important pour moi était de ne pas changer du tout le code par défaut de bootstrap. Ici, c'est mon contrôleur de menu qui recherche les options de menu, puis ajoute le comportement que nous voulons.
la source
eu le même problème. Voici ma solution :
la source
Je viens d'écrire une directive à ce sujet.
Usage:
La mise en oeuvre:
Tests:
la source
La route:
Le menu html:
Le controlle:
Le problème que j'ai trouvé ici est que l'élément de menu n'est actif que lorsque la page entière est chargée. Lorsque la vue partielle est chargée, le menu ne change pas. Quelqu'un sait pourquoi cela se produit?
la source
la source
J'ai trouvé la solution la plus simple. juste pour comparer indexOf en HTML
la source