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

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

Home | About | Contact

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

  1. #/ 집에
  2. #/about 정보 페이지
  3. #/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');
          }

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

이 지시문을 사용하려면

  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>


답변

다음은 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-utilsui-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 에 관심이있을 수 있습니다.