これは、アクティブなリンクを強調表示するためのさらに別のディレクティブです。
主な機能:
- 動的な角度式を含むhrefで正常に動作します
- ハッシュバンナビゲーションと互換性があります
- リンク自体ではなく親liにアクティブクラスを適用する必要があるBootstrapと互換性があります
- ネストされたパスがアクティブな場合にリンクをアクティブにすることができます
- リンクがアクティブでない場合、リンクを無効にすることができます
コード:
.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);
}
);
}
};
}
]);
使用法:
角度式を使用した簡単な例。たとえば、$ scope.var = 2とすると、場所が/ url / 2の場合、リンクがアクティブになります。
<a href="#!/url/{{var}}" active-link>
ブートストラップの例では、親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>
複雑な例では、リンクは1つのURL(/ url1)を指していますが、別のURL(/ url2)が選択されている場合はアクティブになります。
<a href="#!/url1" active-link="#!/url2" active-link-nested>
リンクが無効になっている例。アクティブでない場合は、「無効」クラスになります。
<a href="#!/url" active-link active-link-disabled>
すべてのactive-link-*属性は任意の組み合わせで使用できるため、非常に複雑な条件を実装できます。