这里是另一个突出显示活动链接的指令。
主要特点:
适用于包含动态角度表达式的href
兼容散列导航
与Bootstrap兼容,其中活动类应该应用到父li而不是链接本身
允许使链接活动,如果任何嵌套的路径是活动的
允许禁用make链接,如果它不是活动的
代码:
.directive('activeLink', ['$location',
function($location) {
return {
restrict: 'A',
link: function(scope, elem, attrs) {
var path = attrs.activeLink ? 'activeLink' : 'href';
var target = angular.isDefined(attrs.activeLinkParent) ? elem.parent() : elem;
var disabled = angular.isDefined(attrs.activeLinkDisabled) ? true : false;
var nested = angular.isDefined(attrs.activeLinkNested) ? true : false;
function inPath(needle, haystack) {
var current = (haystack == needle);
if (nested) {
current |= (haystack.indexOf(needle + '/') == 0);
}
return current;
}
function toggleClass(linkPath, locationPath) {
// remove hash prefix and trailing slashes
linkPath = linkPath ? linkPath.replace(/^#!/, '').replace(/\/+$/, '') : '';
locationPath = locationPath.replace(/\/+$/, '');
if (linkPath && inPath(linkPath, locationPath)) {
target.addClass('active');
if (disabled) {
target.removeClass('disabled');
}
} else {
target.removeClass('active');
if (disabled) {
target.addClass('disabled');
}
}
}
// watch if attribute value changes / evaluated
attrs.$observe(path, function(linkPath) {
toggleClass(linkPath, $location.path());
});
// watch if location changes
scope.$watch(
function() {
return $location.path();
},
function(newPath) {
toggleClass(attrs[path], newPath);
}
);
}
};
}
]);
用法:
angular表达式的简单例子,让我们输入$scope。Var = 2,那么链接将是活跃的,如果位置是/url/2:
<a href="#!/url/{{var}}" active-link>
Bootstrap示例,parent li将获得活动类:
<li>
<a href="#!/url" active-link active-link-parent>
</li>
以嵌套url为例,如果任何嵌套url是活动的,链接将是活动的(即/url/1, /url/2, url/1/2/…)
<a href="#!/url" active-link active-link-nested>
复杂的例子,链接指向一个url (/url1),但如果选择另一个url (/url2)将是活动的:
<a href="#!/url1" active-link="#!/url2" active-link-nested>
以禁用链接为例,如果它不是活动的,它将有'disabled'类:
<a href="#!/url" active-link active-link-disabled>
所有active-link-*属性都可以在任何组合中使用,因此可以实现非常复杂的条件。