Juste pour ajouter mon grain de sel dans le débat, j'ai fait un pur angulaire du module (sans jquery), et il fonctionne également avec de hachage des url contenant des données. (j'.g. #/this/is/path?this=is&some=data
)
Il suffit d'ajouter le module en tant que dépendance et de l' auto-active
à l'un des ancêtres du menu. Comme ceci:
<ul auto-active>
<li><a href="#/">main</a></li>
<li><a href="#/first">first</a></li>
<li><a href="#/second">second</a></li>
<li><a href="#/third">third</a></li>
</ul>
Et le module ressembler à ceci:
(function () {
angular.module('autoActive', [])
.directive('autoActive', ['$location', function ($location) {
return {
restrict: 'A',
scope: false,
link: function (scope, element) {
function setActive() {
var path = $location.path();
if (path) {
angular.forEach(element.find('li'), function (li) {
var anchor = li.querySelector('a');
if (anchor.href.match('#' + path + '(?=\\?|$)')) {
angular.element(li).addClass('active');
} else {
angular.element(li).removeClass('active');
}
});
}
}
setActive();
scope.$on('$locationChangeSuccess', setActive);
}
}
}]);
}());
* (Vous pouvez bien sûr utiliser la directive cadre)
** Il est également intéressant de remarquer que cela ne fonctionne pas pour vider les hachages (j'.g. example.com/#
ou juste example.com
), il doit avoir au moins example.com/#/
ou juste example.com#/
. Mais cela se fait automatiquement avec ngResource et la comme.
Et voici le violon: http://jsfiddle.net/gy2an/8/