Angular JS로 부트 스트랩 navbar 활성 클래스를 설정하는 방법은 무엇입니까?


306

부트 스트랩에 항목이있는 탐색 막대가있는 경우

Home | About | Contact

각 메뉴 항목이 활성 일 때 활성 클래스를 설정하려면 어떻게합니까? 즉, class="active"각도 경로가있을 때 어떻게 설정할 수 있습니까

  1. #/ 집에
  2. #/about 정보 페이지
  3. #/contact 연락처 페이지


10
이것은 비슷하지만 탐색 버튼을 강조 표시하는 "각도"가 아닙니다.
— user1876508


Angular 라우팅을 사용하는 경우 아래의 완벽한 답변을 아래에 묻습니다 . stackoverflow.com/a/43822400/474189 .
— 던컨 존스

답변:


598

매우 우아한 방법은 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();
    };
}

10
나는 이것에 익숙하지 않기 때문에 이것을 헤더 지시문에 넣는 방법에 대한 예를 제공 할 수 있다면 감사하겠습니다.
— mono68

41
return $location.path().indexOf(viewLocation) == 0;대신 매개 변수를 사용하여 페이지를 잡을 수 있도록 대신 사용 하는 것이 좋습니다
— Sven Hecht

7
이 작업을 수행하지만 거의하지 않습니다 elegant-경로 이름을 예를 들어 /dogs호출에 복제해야합니다isActive('/dogs')
— wal

7
UI 라우터를 사용하는 경우 ui-sref-active/ui-sref-active-eq지시문을 사용할 수 있습니다 . ui-sref-active-eq='active'또는 ui-sref-active='active'동일한 결과를 달성하기 위해
— Dan Pantry

10
@SvenHecht이 논리의 우려는 홈페이지 링크 (/)가 다른 모든 경로와 일치한다는 것입니다.
— mwotton

51

방금 이것을 처리하기위한 지시문을 작성 했으므로 단순히 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');   
                };
            });     
        });
    }
}
}]);

1
구성 데이터의 중복이 없기 때문에 허용 된 답변
— 보다이 방법

1
나 범위를 사용하는 일 $ 시계 ( "$ routeChangeSuccess"함수 () {.... 대신 범위의 $ ( "$ routeChangeSuccess"에, 기능 () {.....
— aemad

내 자신의 목적을 위해 이것을 조금 조정해야했지만 멋진 답변입니다! 이해하기 쉽습니다.
— Tony Anziano 2016 년

38

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');
          }

        });
      });
    }
  };
});

이 지시문을 사용하려면

  1. http://mgcrea.github.io/angular-strap/ 에서 AngularStrap을 다운로드 하십시오

  2. bootstrap.js 다음에 페이지에 스크립트를 포함 시키십시오.
    <script src="lib/angular-strap.js"></script>

  3. 지시문을 모듈에 추가하십시오.
    angular.module('myApp', ['$strap.directives'])

  4. 탐색 표시 줄에 지시문을 추가하십시오.
    <div class="navbar" bs-navbar>

  5. 각 탐색 항목에 정규식을 추가하십시오.
    <li data-match-route="/about"><a href="#/about">About</a></li>


1
감사. 이것은 내 자신의 지시는 (나를 위해 누락 된 통찰력이 있었다 해결 도움 scope.$watch)
— Ngure Nyaga

element변수가 jquery 선택기에 전달되는 이유는 무엇 입니까? $('...', element)
— Lucio

jQuery를 (선택기 컨텍스트) - - 상기 방법은 두 인자를 @Lucio 더 읽기 - 두 번째 인수는 상위 DOM 요소 또는 다른 jQuery를 오브젝트 그 자체에, 선택기의 컨텍스트를 전달하는 여기
— CoderTR

이것은 나에게 완벽하게 작동합니다. 그러나 mgcrea.github.io/angular-strap 에 따라 모듈에 추가 할 지시문이 변경 mgcrea.ngStrap되지 않았습니다.$strap.directives
— Vixxd

33

다음은 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;
};

2
좋은 접근법. 나는 약간 수정했습니다-ng-class 지시문 (ng-class = {active : isActive ( '/ View1')})을 사용하고 클래스 이름 대신 true / false를 반환하도록 isActive 함수를 업데이트했습니다.
— patelsan

나는 당신의 예제와 같은 모든 것을 복사했으며, 나를 위해 $ location.path ()는 작동하지 않았습니다 ... $ location.url ()로 전환했으며 작동했습니다!
— Paulo Oliveira

14

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>

2
나는 이것이 적어도 대답 2 이상이어야한다고 생각합니다 (적어도 2 이상). 왜 구현이 이미 구현되어 있습니까? 그러나 Bootstrap 3.3의 경우 active클래스는 <li>(routerLink 또는 그 부모와 함께 routerLinkActive를 넣을 수 있습니다)
— PhoneixS

3
참고 : 사용하는 경우 /홈 페이지로, routerLinkActive로 시작하는 URL에 대한 그 활성을 고려할 것 /, 예를 들어 /foo/, /foo/bar정확하게 일치하기 등, 당신이 필요 routerLinkActive="active" [routerLinkActiveOptions]="{exact:true}".
— 던컨 존스

8

우선,이 문제는 많은 방법으로 해결 될 수 있습니다. 이 방법은 가장 우아하지는 않지만 확실히 작동합니다.

다음은 모든 프로젝트에 추가 할 수있는 간단한 솔루션입니다. 키 오프에 사용할 경로를 구성 할 때 "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>

라우트에서 pageKey 값을 보려면 오른쪽으로 스크롤해야합니다. 이것이 전체 솔루션의 핵심입니다.
— Mark At Ramp51

16
이것은 효과가 있지만 Angular.js 앱에 대한 일반적인 조언에 위배됩니다. Angular에서는 jQuery를 사용하여 DOM을 망칠 수 없습니다. DOM을 터치해야하는 경우 지시문을 작성하십시오.
— Paulo Scardine

이것은 dom 조작이 귀찮게하면 .navbar에 지시문을 추가하고 routechangesuccess, $ rootScope. $ broadcast ( 'routeChanged', current.pageKey)에 $ broadcast 이벤트를 추가하는 것만으로도 완벽합니다. 그리고 당신의 지시에 그것을 캡처하고 거기에서 돔 조작을 수행
— Irshu

7

실제로 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 에 관심이있을 수 있습니다.


ui-route 접근법은 매우 유혹적이지만 지금까지 Yeoman의 앵귤러 생성기에서 생성 된 프로젝트에서 작동하도록 관리하지 못했습니다.
— gabuzo

@gabuzo : bower를 통해 angular-ui-utils를 설치 했습니까?
— Lèse majesté

6

나는이 모든 대답을 조금 복잡하게 생각합니다. 죄송합니다. 그래서 나는 네비게이션 바마다 작동 해야하는 작은 지시문을 만들었습니다.

app.directive('activeLink', function () {
    return {
        link: function (scope, element, attrs) {
            element.find('.nav a').on('click', function () {
                angular.element(this)
                    .parent().siblings('.active')
                    .removeClass('active');
                angular.element(this)
                    .parent()
                    .addClass('active');
            });
        }
    };
});

용법:

<ul class="nav navbar-nav navbar-right" active-link>
    <li class="nav active"><a href="home">Home</a></li>
    <li class="nav"><a href="foo">Foo</a></li>
    <li class="nav"><a href="bar">Bar</a></li>
</ul>

방법은 탐색 모음에서 링크를 클릭 한 후에 만 ​​작동합니다. "Foo"인 URL에서 시작하면 처음에는 "Home"이 여전히 선택됩니다. 예를 들어 localhost : 9000 / # / contact 에서 시작하면 탐색 모음에서 홈이 선택된 것으로 나타납니다.
— Adam Plocher

5

ng-class 지시문을 $ location과 함께 사용하여 달성합니다.

<ul class="nav">
<li data-ng-class="{active: ($location.path() == '/') }">
    <a href="#/">Carpeta Amarilla</a>
</li>
<li class="dropdown" data-ng-class="{active: ($location.path() == '/auditoria' || $location.path() == '/auditoria/todos') }">
    <a class="dropdown-toggle" data-toggle="dropdown" href="#">
        Auditoria
        <b class="caret"></b>
    </a>
    <ul class="dropdown-menu pull-right">
        <li data-ng-class="{active: ($location.path() == '/auditoria') }">
            <a href="#/auditoria">Por Legajo</a>
        </li>
        <li data-ng-class="{active: ($location.path() == '/auditoria/todos') }">
            <a href="#/auditoria/todos">General</a>
        </li>
    </ul>
</li>
</ul>

navbar가 다음과 같이 $ location 서비스에 액세스 할 수있는 기본 컨트롤러 내에 있어야합니다.

bajasApp.controller('MenuCntl', ['$scope','$route', '$routeParams', '$location', 
   function MenuCntl($scope, $route, $routeParams, $location) {
   $scope.$route = $route;
   $scope.$location = $location;
   $scope.$routeParams = $routeParams;
}]);

4

다음과 같은 각도 표현의 조건부로이를 달성 할 수 있습니다.

<a href="#" class="{{ condition ? 'active' : '' }}">link</a>

즉,이 미니 로직을 많이 아웃소싱하면 코드베이스가 다소 오염 될 수 있지만 각도 지시어가 더 "적절한"방법이라고 생각합니다.

지시문을 만드는 것보다 조금 빠르기 때문에 개발 중에 가끔씩 GUI 스타일링을위한 조건을 사용합니다. 실제로 실제로 코드베이스에 오랫동안 남아있는 인스턴스는 말할 수 없었습니다. 결국 나는 그것을 지시어로 바꾸거나 문제를 해결하는 더 좋은 방법을 찾습니다.


4

ui-router 를 사용하는 경우 다음 예제는 컨트롤러 측 코드를 추가하지 않고 허용되는 답변에 대한 @DanPantry의 의견을 기반으로 요구를 충족시켜야합니다.

<div class="collapse navbar-collapse" ng-controller="HeaderController">
    <ul class="nav navbar-nav">
        <li ui-sref-active="active"><a ui-sref="app.home()" href="/">Home</a></li>
        <li ui-sref-active="active"><a ui-sref="app.dogs()" href="/dogs">Dogs</a></li>
        <li ui-sref-active="active"><a ui-sref="app.cats()" href="/cats">Cats</a></li>
    </ul>
</div>
<div ng-view></div>

자세한 내용 은 문서 를 확인할 수 있습니다 .


완전한! 반드시 깨끗한 솔루션
— Aryeh Beitz

아주 좋은 해결책이 될 것입니다. 누가 사용하지 않습니다 ui.router!
— dewd

3

AngularStrap 을 사용하지 않으려면 이 지시문이 트릭을 수행해야합니다!. 이것은 https://stackoverflow.com/a/16231859/910764 의 수정입니다. .

자바 스크립트

angular.module('myApp').directive('bsNavbar', ['$location', function ($location) {
  return {
    restrict: 'A',
    link: function postLink(scope, element) {
      scope.$watch(function () {
        return $location.path();
      }, function (path) {
        angular.forEach(element.children(), (function (li) {
          var $li = angular.element(li),
            regex = new RegExp('^' + $li.attr('data-match-route') + '$', 'i'),
            isActive = regex.test(path);
          $li.toggleClass('active', isActive);
        }));
      });
    }
  };
}]);

HTML

<ul class="nav navbar-nav" bs-navbar>
  <li data-match-route="/home"><a href="#/home">Home</a></li>
  <li data-match-route="/about"><a href="#/about">About</a></li>
</ul>

참고 : 위의 HTML 클래스는 Bootstrap 3.x를 사용한다고 가정합니다.


3

여기에 내가 가져 가라. 이 게시물에서 찾은 답변 조합 중 일부입니다. 약간 다른 경우가 있었으므로 내 솔루션에는 메뉴를 Directive Definition Ojbect 내에서 사용할 자체 템플릿으로 분리 한 다음 내 페이지 표시 줄을 필요한 페이지에 추가하는 것이 포함됩니다. 기본적으로 메뉴를 포함하고 싶지 않은 로그인 페이지가 있었으므로 ngInclude를 사용하고 로그인 할 때이 지시문을 삽입했습니다.

지령:

module.directive('compModal', function(){


return {
    restrict: 'E',
    replace: true,
    transclude: true,
    scope: true,
    templateUrl: 'templates/menu.html',
    controller: function($scope, $element, $location){
        $scope.isActive = function(viewLocation){

            var active = false;

            if(viewLocation === $location.path()){
                active = true;
            }

            return active;

        }
    }
 }
});

직접 템플릿 (templates / menu.html)

<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>

Directive를 포함하는 HTML

<comp-navbar/>

도움이 되었기를 바랍니다


1
이 함수는 $ scope.isActive = function (viewLocation) {short viewLocation === $ location.path (); };
— WP McNeill

2

myl 답변을 확장하면서 이와 같은 구조를 처리하기 위해 이것이 필요했습니다.

-인덱스

-events <-active
--- event-list
--- event-edit
--- event-map <-클릭

-places
--- place-list
--- place-edit
--- place-map

따라서 일치하는 대신 조건에 맞게 형식이 지정된 하위 링크의 유효성을 검사하기 위해 indexOf를 사용해야했습니다. 따라서 '이벤트'의 경우 :

<li ng-class="{ active: isActive('/event')}" class="divider-vertical dropdown">


function NavController($scope, $location) { 
$scope.isActive = function (viewLocation) {
    var s=false;
    if($location.path().indexOf(viewLocation) != -1){
     s = true;
    }
    return s;
};}

2

이것은 간단한 해결책입니다

<ul class="nav navbar-nav navbar-right navbar-default menu">
  <li ng-class="menuIndice == 1 ? 'active':''">
    <a ng-click="menuIndice = 1" href="#/item1">item1</a>
  </li>
  <li ng-class="menuIndice == 2 ? 'active':''">
    <a ng-click="menuIndice = 2" href="#/item2">item2</a>
  </li>
  <li ng-class="menuIndice == 3 ? 'active':''">
    <a ng-click="menuIndice = 3" href="#/item3">item3</a>
  </li>
</ul>

1

@Olivier의 AngularStrap 답변과 함께 https://github.com/twbs/bootstrap/issues/9013 에서 kevinknelson의 답변을 구현했습니다 .

기본적으로 Bootstrap3 navbar는 단일 페이지 (예 : Angular) 응용 프로그램 용으로 설계되지 않았으므로 작은 화면에서 메뉴를 클릭 할 때 축소되지 않았습니다.


1

자바 스크립트

/**
 * Main AngularJS Web Application
 */

var app = angular.module('yourWebApp', [
    'ngRoute'
]);


/**
 * Setup Main Menu
 */

app.controller('MainNavCtrl', [ '$scope', '$location', function ( $scope, $location) {
    $scope.menuItems = [
        {
            name: 'Home',
            url:  '/home',
            title: 'Welcome to our Website'
        },
        {
            name: 'ABOUT',
            url:  '/about',
            title: 'Know about our work culture'
        },
        {
            name:   'CONTACT',
            url:    '/contact',
            title:  'Get in touch with us'
        }
    ];

    $scope.isActive = function (viewLocation) {
        return viewLocation === $location.path();
    };
}]);

HTML

  <div class="navbar-collapse collapse" ng-controller="MainNavCtrl">
    <ul id="add-magic-line" class="nav navbar-nav navbar-right">
      <li data-ng-class="{current_page_item: isActive('{{ menuItem.url }}')}" data-ng-repeat="menuItem in menuItems">
        <a data-ng-href="#{{menuItem.url}}" title="{{menuItem.title}}">
          {{menuItem.name}}
        </a>
      </li>
    </ul>
  </div>

이것은 작동하지 않습니다-현재 클래스를 DOM에 추가하지 않습니다
— TheBlackBenzKid

1

덕분에 @Pylinux . 필자는 필자의 기술을 사용하여 "한"수준의 드롭 다운 메뉴 (sub ul / li)를 지원하도록 수정했습니다. 아래의 바이올린 링크에서 작동하는지 확인하십시오.

pylinux의 답변을 기반으로 업데이트 된 Fiddle- http: //jsfiddle.net/abhatia/en4qxw6g/

하나의 레벨 드롭 다운 메뉴를 지원하기 위해 다음 세 가지 사항을 변경했습니다.
1. li 아래의 "a"요소에 대한 클래스 값 dd (드롭 다운)를 추가하여 하위 목록이 필요합니다.

         <li><a class="dd">This link points to #/fun5</a>
          <ul>
            <li><a href="#/fun6?some=data">This link points to #/fun6</a>
            </li>
            <li><a href="#/fun7?some=data">This link points to #/fun7</a>
            </li>
            <li><a href="#/fun8?some=data">This link points to #/fun8</a>
            </li>
            <li><a href="#/fun9?some=data">This link points to #/fun9</a>
            </li>
          </ul>
        </li>


2. 다음 새로운 로직을 추가하도록 Javascript를 업데이트했습니다.

 if(angular.element(li).parent().parent().children('a').hasClass("dd"))
 {angular.element(li).parent().parent().children('a.dd').addClass('active');}


3. 다음을 추가하도록 CSS를 업데이트했습니다.

a.active {background-color:red;}

단일 레벨 드롭 다운 메뉴를 구현하려는 사람에게 도움이되기를 바랍니다.


1

개체를 스위치 변수로 사용하십시오.
다음과 같이 간단하게 인라인 할 수 있습니다.

<ul class="nav navbar-nav">
   <li ng-class="{'active':switch.linkOne}" ng-click="switch = {linkOne: true}"><a href="/">Link One</a></li>
   <li ng-class="{'active':switch.linkTwo}" ng-click="switch = {link-two: true}"><a href="/link-two">Link Two</a></li>
</ul>

링크를 클릭 할 때마다 스위치 개체는 올바른 스위치 개체 속성 만 적용되는 새 개체로 바뀝니다. 정의되지 않은 속성은 false로 평가되므로 속성에 종속 된 요소에는 활성 클래스가 할당되지 않습니다.



0

링크에 지시문을 사용하는 것이 좋습니다. 여기 바이올린이 있습니다.

그러나 아직 완벽하지는 않습니다. 해시 뱅을 조심하십시오;)

지시문에 대한 자바 스크립트는 다음과 같습니다.

angular.module('link', []).
  directive('activeLink', ['$location', function(location) {
    return {
      restrict: 'A',
      link: function(scope, element, attrs, controller) {
        var clazz = attrs.activeLink;
        var path = attrs.href;
        path = path.substring(1); //hack because path does not return including hashbang
        scope.location = location;
        scope.$watch('location.path()', function(newPath) {
          if (path === newPath) {
            element.addClass(clazz);
          } else {
            element.removeClass(clazz);
          }
        });
      }
    };
  }]);

다음은 html에서 사용되는 방법입니다.

<div ng-app="link">
  <a href="#/one" active-link="active">One</a>
  <a href="#/two" active-link="active">One</a>
  <a href="#" active-link="active">home</a>
</div>

이후 CSS로 스타일링하기 :

.active{ color:red; }

0

토론에 2 센트를 추가하기 위해 순수한 각도 모듈 (jquery 없음)을 만들었으며 데이터가 포함 된 해시 URL에서도 작동합니다. ( ig #/this/is/path?this=is&some=data )

모듈을 종속성으로 그리고 auto-active메뉴의 조상 중 하나에 추가하기 만하면 됩니다. 이처럼 :

<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>

그리고 모듈은 다음과 같습니다 :

(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);
            }
        }
    }]);
}());

* (물론 지시문 부분을 사용할 수 있습니다)

** 이것은 빈 해시 ( ig example.com/# 또는 just example.com)에 대해서는 작동하지 않는다는 사실에 주목할 가치가 example.com/#/있습니다 example.com#/. 그러나 이것은 ngResource 등에서 자동으로 발생합니다.


그저 불쾌합니다. Angular를 사용하는 이유는 간단합니다.
— Tom Stickel

0

이것은 나를 위해 속임수를했다 :

  var domain = '{{ DOMAIN }}'; // www.example.com or dev.example.com
  var domain_index =  window.location.href.indexOf(domain);
  var long_app_name = window.location.href.slice(domain_index+domain.length+1); 
  // this turns http://www.example.com/whatever/whatever to whatever/whatever
  app_name = long_app_name.slice(0, long_app_name.indexOf('/')); 
  //now you are left off with just the first whatever which is usually your app name

그런 다음 jquery를 사용하여 각도도 작동합니다.

$('nav a[href*="' + app_name+'"]').closest('li').addClass('active');

그리고 물론 CSS :

.active{background:red;}

다음과 같이 HTML이 있으면 작동합니다.

<ul><li><a href="/ee">ee</a></li><li><a href="/dd">dd</a></li></ul>

www.somesite.com/ee에서 ee가 '앱'이고 활성화되면 페이지 URL을 사용하여 클래스 활성을 추가하고 배경색을 빨간색으로 채색합니다.


0

이것은 오랫동안 대답했지만 내 방식을 공유 할 것이라고 생각했습니다.

.run(function($rootScope, $state){
 $rootScope.$state = $state;
});

주형:

<ul class="nav navbar-nav">
    <li ng-class="{ active: $state.contains('View1') }"><a href="...">View 1</a></li>
    <li ng-class="{ active: $state.contains('View2') }"><a href="...">View 2</a></li>
    <li ng-class="{ active: $state.contains('View3') }"><a href="...">View 3</a></li>
</ul>

다음을 사용하는 사람들 ui-router:

<ul class="nav navbar-nav">
        <li ui-sref-active="active"><a href="...">View 1</a></li>
        <li ui-sref-active="active"><a href="...">View 2</a></li>
        <li ui-sref-active="active"><a href="...">View 3</a></li>
</ul>

정확히 일치하려면 (예 : 중첩 된 상태?) $state.name === 'full/path/to/state'또는ui-sref-active-eq="active"


0

관심이있는 사람을위한 또 다른 솔루션이 있습니다. 이것의 장점은 의존성이 적다는 것입니다. 웹 서버 없이도 작동합니다. 그래서 그것은 완전히 클라이언트 측입니다.

HTML :

<nav class="navbar navbar-inverse" ng-controller="topNavBarCtrl"">
<div class="container-fluid">
    <div class="navbar-header">
        <a class="navbar-brand" href="#"><span class="glyphicon glyphicon-home" aria-hidden="true"></span></a>
    </div>
    <ul class="nav navbar-nav">
        <li ng-click="selectTab()" ng-class="getTabClass()"><a href="#">Home</a></li>
        <li ng-repeat="tab in tabs" ng-click="selectTab(tab)" ng-class="getTabClass(tab)"><a href="#">{{ tab }}</a></li>
    </ul>
</div>

설명:

여기서 지시어를 사용하여 angularjs 모델에서 동적으로 링크를 생성합니다 ng-repeat. 마술은 방법으로 발생 selectTab()하고getTabClass() 아래에 제시,이 메뉴 바의 컨트롤러에 정의.

제어 장치:

angular.module("app.NavigationControllersModule", [])

// Constant named 'activeTab' holding the value 'active'. We will use this to set the class name of the <li> element that is selected.
.constant("activeTab", "active")

.controller("topNavBarCtrl", function($scope, activeTab){
    // Model used for the ng-repeat directive in the template.
    $scope.tabs = ["Page 1", "Page 2", "Page 3"];

    var selectedTab = null;

    // Sets the selectedTab.
    $scope.selectTab = function(newTab){
       selectedTab = newTab;
    };

    // Sets class of the selectedTab to 'active'.
    $scope.getTabClass = function(tab){
       return selectedTab == tab ? activeTab : "";
    };
});

설명:

selectTab()메소드는 ng-click지시문을 사용하여 호출됩니다 . 따라서 링크를 클릭하면 변수 selectedTab가이 링크의 이름으로 설정됩니다. HTML에서이 메소드가 홈 탭에 대한 인수없이 호출되어 페이지가로드 될 때 강조 표시됨을 알 수 있습니다.

이 getTabClass()메소드는 ng-classHTML에서 지시문을 통해 호출됩니다 . 이 방법은 탭이있는 selectedTab변수가 변수 의 값과 같은지 확인 합니다. true 인 경우 "active"를 반환하고 그렇지 않으면 ng-class지시어에 의해 클래스 이름으로 적용되는 ""를 반환 합니다. 그런 다음 수업에 적용한 CSS active가 선택한 탭에 적용됩니다.


다른 방법으로 다른 탭으로 이동합니까?
— Miguel Carvajal

무슨 소리 야?
— kovac

예를 들어, 다른 탭 내에있는 다른 페이지로 연결되는 페이지의 링크. 말이된다?
— Miguel Carvajal

이 경우 위 답변에서 Muli Yulzary가 제안한대로 ui-router를 사용하는 것이 좋습니다. ui-router는 각 URL에 상태를 할당합니다. 따라서 누군가 링크를 클릭하면 사용자가 해당 링크로 라우팅되고 각도 앱의 상태가 업데이트됩니다. 그러면 ui-sref = "active"가 탭을 강조 표시합니다. angular 2 : ui-router.github.io/ng2에 대한 설명서입니다 . 또한 일반적인 부트 스트랩을 사용하는 대신 Angular 앱과 함께 사용하기 위해 수행 된 UI 부트 스트랩을 살펴보십시오. UI 부트 스트랩 : angular-ui.github.io/bootstrap
— 코바치

0

active필요한 색상 코드를 사용 하여 필요한 클래스 를 추가해야합니다 .

전의: ng-class="{'active': currentNavSelected}" ng-click="setNav"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.