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.