如果我在引导程序中有一个带有项目的导航栏
Home | About | Contact
当每个菜单项处于活动状态时,如何为它们设置活动类?也就是说,我如何设置class="active"
角度路线在
#/
为家#/about
关于页面#/contact
对于联系页面
如果我在引导程序中有一个带有项目的导航栏
Home | About | Contact
当每个菜单项处于活动状态时,如何为它们设置活动类?也就是说,我如何设置class="active"
角度路线在
#/
为家#/about
关于页面#/contact
对于联系页面一种非常优雅的方法是使用 ng-controller 在 ng-view 之外运行单个控制器:
<div class="collapse navbar-collapse" ng-controller="HeaderController">
<ul class="nav navbar-nav">
<li ng-class="{ active: isActive('/')}"><a href="/">Home</a></li>
<li ng-class="{ active: isActive('/dogs')}"><a href="/dogs">Dogs</a></li>
<li ng-class="{ active: isActive('/cats')}"><a href="/cats">Cats</a></li>
</ul>
</div>
<div ng-view></div>
并包含在controllers.js 中:
function HeaderController($scope, $location)
{
$scope.isActive = function (viewLocation) {
return viewLocation === $location.path();
};
}
我刚刚写了一个指令来处理这个,所以你可以简单地将属性添加bs-active-link
到父<ul>
元素,并且任何时候路由发生变化,它都会找到匹配的链接,并将active
类添加到相应的<li>
.
你可以在这里看到它的实际效果:http : //jsfiddle.net/8mcedv3b/
示例 HTML:
<ul class="nav navbar-nav" bs-active-link>
<li><a href="/home">Home</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
Javascript:
angular.module('appName')
.directive('bsActiveLink', ['$location', function ($location) {
return {
restrict: 'A', //use as attribute
replace: false,
link: function (scope, elem) {
//after the route has changed
scope.$on("$routeChangeSuccess", function () {
var hrefs = ['/#' + $location.path(),
'#' + $location.path(), //html5: false
$location.path()]; //html5: true
angular.forEach(elem.find('a'), function (a) {
a = angular.element(a);
if (-1 !== hrefs.indexOf(a.attr('href'))) {
a.parent().addClass('active');
} else {
a.parent().removeClass('active');
};
});
});
}
}
}]);
你可以看看AngularStrap,导航栏指令似乎是你正在寻找的:
https://github.com/mgcrea/angular-strap/blob/master/src/navbar/navbar.js
.directive('bsNavbar', function($location) {
'use strict';
return {
restrict: 'A',
link: function postLink(scope, element, attrs, controller) {
// Watch for the $location
scope.$watch(function() {
return $location.path();
}, function(newValue, oldValue) {
$('li[data-match-route]', element).each(function(k, li) {
var $li = angular.element(li),
// data('match-rout') does not work with dynamic attributes
pattern = $li.attr('data-match-route'),
regexp = new RegExp('^' + pattern + '$', ['i']);
if(regexp.test(newValue)) {
$li.addClass('active');
} else {
$li.removeClass('active');
}
});
});
}
};
});
要使用此指令:
从http://mgcrea.github.io/angular-strap/下载 AngularStrap
在 bootstrap.js 之后在页面上包含脚本:
<script src="lib/angular-strap.js"></script>
将指令添加到您的module中:
angular.module('myApp', ['$strap.directives'])
将指令添加到您的导航栏:
<div class="navbar" bs-navbar>
在每个导航项上添加正则表达式:
<li data-match-route="/about"><a href="#/about">About</a></li>
这是一种适用于 Angular 的简单方法。
<ul class="nav navbar-nav">
<li ng-class="{ active: isActive('/View1') }"><a href="#/View1">View 1</a></li>
<li ng-class="{ active: isActive('/View2') }"><a href="#/View2">View 2</a></li>
<li ng-class="{ active: isActive('/View3') }"><a href="#/View3">View 3</a></li>
</ul>
在你的 AngularJS 控制器中:
$scope.isActive = function (viewLocation) {
var active = (viewLocation === $location.path());
return active;
};
如果您正在使用 Angular 路由器,则可以非常优雅地使用RouterLinkActive 指令:
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link" routerLink="home" routerLinkActive="active">Home</a></li>
<li class="nav-item"><a class="nav-link" routerLink="gallery" routerLinkActive="active">Gallery</a></li>
<li class="nav-item"><a class="nav-link" routerLink="pricing" routerLinkActive="active">Prices</a></li>
<li class="nav-item"><a class="nav-link" routerLink="contact" routerLinkActive="active">Contact</a></li>
</ul>