[javascript] Angular JS로 부트 스트랩 navbar 활성 클래스를 설정하는 방법은 무엇입니까?
부트 스트랩에 항목이있는 탐색 막대가있는 경우
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>
자바 스크립트 :
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>
-
지시문을 모듈에 추가하십시오.
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>
답변
우선,이 문제는 많은 방법으로 해결 될 수 있습니다. 이 방법은 가장 우아하지는 않지만 확실히 작동합니다.
다음은 모든 프로젝트에 추가 할 수있는 간단한 솔루션입니다. 키 오프에 사용할 경로를 구성 할 때 “pageKey”또는 다른 속성을 추가하면됩니다. 또한 $ route 객체의 $ routeChangeSuccess 메서드에서 리스너를 구현하여 경로 변경이 성공적으로 완료되었음을 수신 할 수 있습니다.
핸들러가 시작되면 페이지 키를 얻고이 키를 사용하여이 페이지에 대해 “ACTIVE”여야하는 요소를 찾고 ACTIVE 클래스를 적용하십시오.
모든 요소를 ”활성 상태”로 만드는 방법이 필요합니다. 보시다시피 내 탐색 항목에서 .pageKey 클래스를 사용하여 모든 항목을 끄고 .pageKey_ {PAGEKEY}를 사용하여 개별적으로 켤 수 있습니다. 그것들을 모두 비활성으로 전환하는 것은 순진한 접근 방식으로 간주되며 잠재적으로 이전 경로를 사용하여 활성 항목 만 비활성 상태로 만들거나 jquery 선택기를 변경하여 활성 항목 만 선택하여 비활성 상태로 만들 수 있습니다. jquery를 사용하여 모든 활성 항목을 선택하는 것이 가장 좋은 솔루션 일 것입니다. 이전 경로에있을 수있는 CSS 버그가있는 경우 현재 경로에 대한 모든 것이 정리되도록하기 때문입니다.
이 코드 줄을 변경한다는 의미는 다음과 같습니다.
$(".pagekey").toggleClass("active", false);
이것에
$(".active").toggleClass("active", false);
샘플 코드는 다음과 같습니다.
부트 스트랩 navbar가 주어지면
<div class="navbar navbar-inverse">
<div class="navbar-inner">
<a class="brand" href="#">Title</a>
<ul class="nav">
<li><a href="#!/" class="pagekey pagekey_HOME">Home</a></li>
<li><a href="#!/page1/create" class="pagekey pagekey_CREATE">Page 1 Create</a></li>
<li><a href="#!/page1/edit/1" class="pagekey pagekey_EDIT">Page 1 Edit</a></li>
<li><a href="#!/page1/published/1" class="pagekey pagekey_PUBLISH">Page 1 Published</a></li>
</ul>
</div>
</div>
그리고 다음과 같은 각도 모듈과 컨트롤러 :
<script type="text/javascript">
function Ctrl($scope, $http, $routeParams, $location, $route) {
}
angular.module('BookingFormBuilder', []).
config(function ($routeProvider, $locationProvider) {
$routeProvider.
when('/', {
template: 'I\'m on the home page',
controller: Ctrl,
pageKey: 'HOME' }).
when('/page1/create', {
template: 'I\'m on page 1 create',
controller: Ctrl,
pageKey: 'CREATE' }).
when('/page1/edit/:id', {
template: 'I\'m on page 1 edit {id}',
controller: Ctrl, pageKey: 'EDIT' }).
when('/page1/published/:id', {
template: 'I\'m on page 1 publish {id}',
controller: Ctrl, pageKey: 'PUBLISH' }).
otherwise({ redirectTo: '/' });
$locationProvider.hashPrefix("!");
}).run(function ($rootScope, $http, $route) {
$rootScope.$on("$routeChangeSuccess",
function (angularEvent,
currentRoute,
previousRoute) {
var pageKey = currentRoute.pageKey;
$(".pagekey").toggleClass("active", false);
$(".pagekey_" + pageKey).toggleClass("active", true);
});
});
</script>
답변
실제로 angular-ui-utils ‘ ui-route
지시문을 사용할 수 있습니다 .
<a ui-route ng-href="/">Home</a>
<a ui-route ng-href="/about">About</a>
<a ui-route ng-href="/contact">Contact</a>
또는:
헤더 컨트롤러
/**
* Header controller
*/
angular.module('myApp')
.controller('HeaderCtrl', function ($scope) {
$scope.menuItems = [
{
name: 'Home',
url: '/',
title: 'Go to homepage.'
},
{
name: 'About',
url: '/about',
title: 'Learn about the project.'
},
{
name: 'Contact',
url: '/contact',
title: 'Contact us.'
}
];
});
색인 페이지
<!-- index.html: -->
<div class="header" ng-controller="HeaderCtrl">
<ul class="nav navbar-nav navbar-right">
<li ui-route="{{menuItem.url}}" ng-class="{active: $uiRoute}"
ng-repeat="menuItem in menuItems">
<a ng-href="#{{menuItem.url}}" title="{{menuItem.title}}">
{{menuItem.name}}
</a>
</li>
</ul>
</div>
ui-utils를 사용 하는 경우 부분 / 중첩 된보기를 관리하기위한 ui-router 에 관심이있을 수 있습니다.