Angular JS ile bootstrap navbar aktif sınıf nasıl ayarlanır?


306

Eğer öğelerle bootstrap içinde bir navbar varsa

Home | About | Contact

Her menü öğesi için etkin olduklarında etkin sınıfı nasıl ayarlayabilirim? Yani, class="active"açısal rota olduğu zaman nasıl ayarlayabilirim

  1. #/ ev için
  2. #/about yaklaşık sayfa için
  3. #/contact iletişim sayfası için


10
Bu benzerdir, ancak gezinme düğmelerini vurgulamanın "açısal bir yolu" değildir.
user1876508


Açısal yönlendirme kullanıyorsanız , lütfen mükemmel cevabın aşağıya gömüldüğüne dikkat edin: stackoverflow.com/a/43822400/474189 .
Duncan Jones

Yanıtlar:


598

Çok şık bir yol, ng-kontrolünün dışında ng-kontrolörü kullanmaktır:

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

ve controllers.js'ye ekleyin:

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

10
Bu konuda yeni olduğum için, bunu bir başlık direktifine nasıl koyacağınıza dair bir örnek verebilirseniz sevinirim, lütfen.
mono68

41
return $location.path().indexOf(viewLocation) == 0;Parametreleri olan sayfaları da yakalayabilmeniz için bunun yerine kullanmanızı öneririm
Sven Hecht

7
Bu işi hallediyor ama zor elegant- rota adı örneğin/dogsisActive('/dogs')
wal

7
UI Router kullanıyorsanız, ui-sref-active/ui-sref-active-eqyönergeleri kullanabilirsiniz . sonuçları ui-sref-active-eq='active'da ui-sref-active='active'elde etmek için
Dan Pantry

10
@SvenHecht Bu mantıkla ilgili endişe, bir ana sayfa bağlantısının (/) diğer tüm yollarla eşleşmesidir.
mwotton

51

Bunu ele almak için sadece bir yönerge yazdım, böylece özniteliği bs-active-linküst <ul>öğeye ekleyebilir ve rota her değiştiğinde, eşleşen bağlantıyı bulacaktır activeve karşılık gelen sınıfı ekleyebilirsiniz <li>.

Burada çalışırken görebilirsiniz: http://jsfiddle.net/8mcedv3b/

Örnek HTML:

<ul class="nav navbar-nav" bs-active-link>
  <li><a href="/home">Home</a></li>
  <li><a href="/contact">Contact</a></li>
</ul>

JavaScript:

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
Ben yapılandırılmış veri çoğaltılması yoktur, çünkü rotaları kendilerini tek bir yerde kalır ve bu sadece çalışır çünkü kabul edilen cevap daha iyi gibi ..
Aaron Anodide

1
Beni kapsamı kullanarak çalışmış $ izle ( "$ routeChangeSuccess", function () {.... yerine kapsamının $ ( "$ routeChangeSuccess" konulu, function () {......
aemad

Bu benim kendi amaçları için biraz tweak gerekiyordu, ama harika cevap! Anlamak için yeterince kolay.
Tony Anziano

38

AngularStrap'a bir göz atabilirsiniz , navbar direktifi aradığınız şey gibi görünüyor:

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

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

Bu yönergeyi kullanmak için:

  1. Http://mgcrea.github.io/angular-strap/ adresinden AngularStrap'ı indirin

  2. Komut dosyasını bootstrap.js'den sonra sayfanıza ekleyin:
    <script src="lib/angular-strap.js"></script>

  3. Yönergeleri modülünüze ekleyin:
    angular.module('myApp', ['$strap.directives'])

  4. Yönergeyi navbar'ınıza ekleyin:
    <div class="navbar" bs-navbar>

  5. Her gezinme öğesine normal ifadeler ekleyin:
    <li data-match-route="/about"><a href="#/about">About</a></li>


1
Teşekkürler. Bu benim kendi direktifimi düzeltmeme yardımcı oldu (benim için eksik fikir scope.$watch
buydu

elementDeğişken neden jquery seçiciye aktarılıyor? $('...', element)
Lucio

@Lucio yöntem 2 argüman alır - jQuery (seçici, bağlam) - ikinci argüman, seçicinin bağlamını, üst DOM öğesi veya başka bir jQuery nesnesinin kendisini
geçirmektir

Bu benim için mükemmel çalışıyor - Bununla birlikte, mgcrea.github.io/angular-strap başına modülünüze ekleme yönergesi mgcrea.ngStrapdeğil$strap.directives
Vixxd

33

İşte Angular ile iyi çalışan basit bir yaklaşım.

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

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

2
Güzel yaklaşım. Biraz değiştirdim - ng-class direktifini (ng-class = {active: isActive ('/ View1')}) kullandım ve isActive işlevini sınıf adının kendisi yerine true / false döndürmek için güncelledim.
patelsan

Örneğiniz gibi her şeyi kopyaladım ve benim için $ location.path () işe yaramadı ... $ location.url () 'a geçti ve işe yaradı!
Paulo Oliveira

14

Açısal yönlendirici ile çalışıyorsanız, RouterLinkActive yönergesi gerçekten zarif bir şekilde kullanılabilir:

<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
Sanırım bu kabul edilen cevap olmalı (en azından açısal 2+ için), neden bir şey zaten uygulanmış? Ancak Bootstrap 3.3 için activesınıfın içinde olması gerekir <li>(routerLinkActive'i routerLink veya ebeveyniyle birlikte koyabilirsiniz)
PhoneixS

3
Not: Kullanmak eğer /ana sayfası gibi routerLinkActiveile başlayan herhangi bir URL için bu aktif dikkate alacaktır /, örneğin /foo/, /foo/bartam olarak eşleşmesi için vb İhtiyacınız routerLinkActive="active" [routerLinkActiveOptions]="{exact:true}".
Duncan Jones

8

Her şeyden önce, bu sorun birçok şekilde çözülebilir. Bu şekilde en zarif olmayabilir, ancak cerntainly çalışır.

İşte herhangi bir projeye ekleyebileceğiniz basit bir çözüm. Rotanızı yapılandırmak için tuşunu kapatmak için kullanabileceğiniz bir "pageKey" veya başka bir özellik ekleyebilirsiniz. Ayrıca, bir rota değişikliğinin başarıyla tamamlandığını dinlemek için $ route nesnesinin $ routeChangeSuccess yöntemine bir dinleyici uygulayabilirsiniz.

İşleyiciniz tetiklendiğinde sayfa anahtarını alırsınız ve bu anahtarı bu sayfa için "AKTİF" olması gereken öğeleri bulmak için kullanırsınız ve ACTIVE sınıfını uygularsınız.

TÜM öğeleri "AKTİF" yapmak için bir yol gerektiğini unutmayın. Gördüğünüz gibi hepsini kapatmak için nav öğelerimde .pageKey sınıfını kullanıyorum ve tek tek açmak için .pageKey_ {PAGEKEY} kullanıyorum. Hepsini etkin olmayan olarak değiştirmek, naif bir yaklaşım olarak değerlendirilir, potansiyel olarak yalnızca etkin öğeleri devre dışı bırakmak için önceki rotayı kullanarak daha iyi performans elde edersiniz veya jquery seçiciyi yalnızca etkin olmayan yapılacak öğeleri seçmek için değiştirebilirsiniz. Tüm etkin öğeleri seçmek için jquery kullanmak muhtemelen en iyi çözümdür, çünkü önceki rotada mevcut olabilecek herhangi bir css hatası olması durumunda her şeyin mevcut yol için temizlenmesini sağlar.

Bu, bu kod satırını değiştirmek anlamına gelir:

$(".pagekey").toggleClass("active", false);

buna

$(".active").toggleClass("active", false);

İşte bazı örnek kod:

Bir bootstrap navbar verildi

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

Ve aşağıdaki gibi bir açısal modül ve kontrolör:

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

Rotalardaki pageKey değerlerini görmek için sağa kaydırmanız gerekir, bu tüm çözümün anahtarıdır.
Mark At Ramp51

16
Bu işe yarayabilir, ancak Angular.js uygulamaları için genel tavsiyeye aykırıdır: Angular'da jQuery kullanarak DOM ile uğraşmaktan kaçınmalısınız; DOM'ye dokunmanız gerekiyorsa, bir yönerge yazın.
Paulo Scardine

bu mükemmeldir, dom manipülasyonu sizi rahatsız ederse, sadece .navbar'a bir yönerge ekleyin, rutechangesuccess, $ rootScope. $ broadcast ($ routeChanged ', current.pageKey) içine bir $ broadcast olayı ekleyin; ve onu direktifinizde yakalayın ve orada dom manipülasyonlarını yapın
Irshu

7

Aslında kullanabilirsiniz açısal-ui-utils ' ui-routedirektifini:

<a ui-route ng-href="/">Home</a>
<a ui-route ng-href="/about">About</a>
<a ui-route ng-href="/contact">Contact</a>

veya:

Başlık Kontrolörü

/**
 * 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.'
      }
    ];
  });

Dizin sayfası

<!-- 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 kullanıyorsanız, kısmi / iç içe görünümleri yönetmek için ui-yönlendirici de ilginizi çekebilir .


Ui-route yaklaşımı çok baştan çıkarıcı ama şimdiye kadar Yeoman'ın açısal jeneratörü tarafından üretilen proje üzerinde çalışmayı başaramadım.
gabuzo

@gabuzo: Açısal-ui-utils'i bower üzerinden mi kurdunuz?
Lèse majesté

6

Bütün bu cevapları benim için biraz fazla karmaşık buluyorum, üzgünüm. Bu yüzden navbar başına çalışması gereken küçük bir yönerge oluşturdum:

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

Kullanımı:

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

Yönteminiz yalnızca gezinme çubuğundaki bir bağlantıyı tıkladıktan sonra çalışır. "Foo" olan bir URL'den başlarsanız, "Ana Sayfa" başlangıçta sabit olarak seçilir. Örneğin localhost'tan başlamak : 9000 / # / contact , gezinme çubuğunda Ana Sayfa'nın seçili görünmesine neden olur.
Adam Plocher

5

Bunu başarmak için ng-class yönergesini $ location ile kullanıyorum.

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

Gezinme çubuğunun aşağıdaki gibi $ konum hizmetine erişimi olan bir ana Denetleyici içinde olmasını gerektirir:

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

4

Bunu, aşağıdakiler gibi bir açısal ifadede bir koşulla gerçekleştirebilirsiniz:

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

Olduğu söyleniyor, ben bu mini-mantık bir çok dış kaynak biraz kod tabanı kirletmek olsa bile, bunu yapmak için daha "uygun" yolu olmak için bir açısal yönerge bulmak.

Geliştirme sırasında GUI stili için arada bir şartlar kullanıyorum, çünkü direktifler oluşturmaktan biraz daha hızlı. Size aslında kod tabanında uzun süre kaldıkları bir örnek söyleyemedim. Sonunda ya bir direktif haline getiriyorum ya da sorunu çözmek için daha iyi bir yol buluyorum.


4

Eğer kullanırsanız -yönlendirici ui , aşağıdaki örnekte herhangi kontrolör tarafında kod eklemeden kabul yanıta DanPantry yorumuyla @ dayalı ihtiyaçlarını karşılamak olmalıdır:

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

Daha fazla bilgi için dokümanları kontrol edebilirsiniz .


mükemmel! Kesinlikle en temiz çözüm
Aryeh Beitz

oldukça basit bir çözüm. kim kullanmaz ui.router!
'14:

3

AngularStrap kullanmak istemiyorsanız, bu direktif hile yapmalıdır !. Bu, https://stackoverflow.com/a/16231859/910764 adresindeki bir değişikliktir .

JavaScript

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>

Not: Yukarıdaki HTML sınıfları, Bootstrap 3.x kullandığınızı varsayar.


3

Heres benim almam. Bu yayında bulunan cevapların bir kısmı. Biraz farklı bir durumum vardı, bu yüzden çözümüm, Yönerge Tanım Ojbect içinde kullanılacak kendi şablonuna ayrılmayı ve ardından ihtiyaç duyduğum sayfaya navbar'ımı eklemeyi içeriyor. Temel olarak, menümü dahil etmek istemediğim bir giriş sayfası vardı, bu yüzden giriş yaptığınızda ngInclude ve bu yönergeyi ekledim:

DİREKTİF:

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;

        }
    }
 }
});

DİREKTİF ŞABLON (şablonlar / 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>

DİREKTİFİ KAPSAYAN HTML

<comp-navbar/>

Bu yardımcı olur umarım


1
İşlev yalnızca $ scope.isActive = function (viewLocation) olarak kısaltılabilir {return viewLocation === $ location.path (); };
WP McNeill

2

Myl cevabını genişleterek, böyle bir yapıyı idare etmek için buna ihtiyacım vardı.

-index

-events <-aktif
--- olay listesi
--- olay düzenleme
--- olay-haritası <-tıkladı

-yerler
--- yer listesi
--- yer-düzenle
--- yer-haritası

eşleştirme yerine, koşula uyacak şekilde biçimlendirilmiş çocuk bağlantılarını doğrulamak için indexOf kullanmak zorunda kaldım. Yani 'etkinlikler' için:

<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

Bu basit bir çözüm

<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'in AngularStrap cevap @ ile birlikte, ben de gelen kevinknelson cevabını hayata https://github.com/twbs/bootstrap/issues/9013 .

Yerel olarak, Bootstrap3 gezinti çubuğu tek sayfalık (örn. Açısal) bir uygulama için tasarlanmamıştır ve bu nedenle küçük bir ekranda tıklandığında menü daraltılmamıştır.


1

JavaScript

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

Bu işe yaramaz - geçerli sınıfı DOM'a eklemez
TheBlackBenzKid

1

@Pylinux'a teşekkürler . Ben tekniğini kullandım ve aynı zamanda gerekli olan gibi, "aşağı" açılır menü (alt ul / li) seviyesini desteklemek için değiştirdim. Aşağıdaki keman bağlantısında çalışırken görün.

Pylinux'un cevabına göre güncellenmiş Fiddle - http://jsfiddle.net/abhatia/en4qxw6g/

Bir seviye aşağı açılır menüyü desteklemek için aşağıdaki üç değişikliği yaptım:
1. Alt ul listesi olması gereken li altında "a" öğesi için dd (açılır) sınıf değeri eklendi.

         <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. Aşağıdaki yeni mantığı eklemek için Javascript güncellendi.

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


3. Aşağıdakileri eklemek için CSS güncellendi:

a.active {background-color:red;}

Umarım bu tek seviyeli açılır menü uygulamak isteyen biri için yararlı olacaktır.


1

Nesneyi anahtar değişkeni olarak kullanın.
Bu satır içi işlemi oldukça basit bir şekilde yapabilirsiniz:

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

Bir bağlantıyı her tıklattığınızda, anahtar nesnesinin yerini, yalnızca doğru anahtar nesnesi özelliğinin doğru olduğu yeni bir nesne alır. Undefined özellikleri false olarak değerlendirilir ve bu nedenle onlara bağımlı öğelere etkin sınıf atanmaz.



0

Bir link üzerinde direktif kullanmanızı öneririm. İşte keman.

Ama henüz mükemmel değil. Hashbanglara dikkat edin;)

İşte direktif için javascript:

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

ve html'de nasıl kullanılacağı aşağıda açıklanmıştır:

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

daha sonra css ile şekillendirme:

.active{ color:red; }

0

Sadece iki sentimi tartışmaya eklemek için saf bir açısal modül yaptım (jquery yok) ve ayrıca veri içeren karma URL'lerle de çalışacak. ( ig #/this/is/path?this=is&some=data )

Modülü sadece bağımlılık olarak ve auto-activemenünün atalarından birine eklersiniz . Bunun gibi:

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

Ve modül şöyle görünür:

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

* (Tabii ki sadece yönerge bölümünü kullanabilirsiniz)

** Bunun , en azından veya adil olması gereken boş karmalar ( ig example.com/# veya just example.com) için işe yaramadığını da fark etmek gerekir . Ancak bu ngResource ve benzerlerinde otomatik olarak gerçekleşir.example.com/#/example.com#/


Bu sadece kötü. Angular'ı kullanma nedeni basitlik içindir.
Tom Stickel

0

Bu benim için hile yaptı:

  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

sonra aktif sınıf eklemek için jquery (açısal ile çalışır) kullanın

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

ve elbette css:

.active{background:red;}

html'niz böyle ise bu çalışır:

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

Bu, sayfa URL'sini kullanarak atumatik olarak aktif sınıf ekler ve www.somesite.com/ee thaen ee 'app' ise ve arka planınız kırmızıya renk verir


0

Bu uzun zamandır cevaplandı ama yolumu paylaşacağımı düşündüm:

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

Şablon:

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

Kullananlar için 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>

Tam eşleşme için (örn. İç içe durumlar?) $state.name === 'full/path/to/state'Veyaui-sref-active-eq="active"


0

İşte ilgilenebilecek herkes için başka bir çözüm. Bunun avantajı, daha az bağımlılığa sahip olmasıdır. Heck, bir web sunucusu olmadan da çalışır. Yani tamamen müşteri tarafında.

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>

Açıklama:

Burada direktifi kullanarak bir angularjs modelinden linkleri dinamik olarak üretiyoruz ng-repeat. Sihirli yöntemleri ile olur selectTab()ve getTabClass()aşağıda sunulan bu gezinme çubuğu için denetleyici tanımlanan.

Denetleyici:

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 : "";
    };
});

Açıklama:

selectTab()yöntem ng-clickdirektif kullanılarak çağrılır . Yani bağlantı tıklandığında, değişkenselectedTab bu bağlantının adına ayarlanır. HTML'de, bu yöntemin Ana Sayfa sekmesi için herhangi bir bağımsız değişken olmadan çağrıldığını görebilirsiniz, böylece sayfa yüklendiğinde vurgulanır.

getTabClass()Yöntem aracılığıyla denir ng-classHTML yönergesi. Bu yöntem, içinde bulunduğu sekmenin selectedTabdeğişkenin değeriyle aynı olup olmadığını kontrol eder . True olursa, ng-classyönerge ile sınıf adı olarak uygulanan "active" else return "" değerini döndürür . Ardından sınıfa uyguladığınız css activeseçili sekmeye uygulanır.


Başka bir sekmeye başka bir yolla gitmek ne olur?
Miguel Carvajal

Ne demek istiyorsun?
kovac

örneğin, sizi başka bir sekmedeki başka bir sayfaya götüren bir bağlantı. Mantıklı?
Miguel Carvajal

Bu durumda, yukarıdaki cevapta Muli Yulzary tarafından önerildiği gibi ui-router'ı kullanmanın daha iyi olduğunu düşünüyorum. ui-router her url'ye bir durum atar. Birisi bağlantıyı tıkladığında, kullanıcı bu bağlantıya yönlendirilir ve açısal uygulamanın durumu güncellenir. Ardından ui-sref = "active" sekmesini vurgulayacaktır. Açısal 2 için belgeler: ui-router.github.io/ng2 . Ayrıca, normal bootstrap kullanmak yerine Açısal uygulamalar ile yapılan UI Bootstrap'e bakın. UI Bootstrap: angular-ui.github.io/bootstrap
kovac

0

Sadece activegerekli renk kodunu içeren gerekli-sınıfı eklemelisiniz .

Ör: ng-class="{'active': currentNavSelected}" ng-click="setNav"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.