AngularJS के साथ सक्रिय टैब शैली सेट करें


144

मेरे पास इस तरह से AngularJS में निर्धारित मार्ग हैं:

$routeProvider
    .when('/dashboard', {templateUrl:'partials/dashboard', controller:widgetsController})
    .when('/lab', {templateUrl:'partials/lab', controller:widgetsController})

मेरे पास टैब के रूप में स्टाइल किए गए टॉपबार पर कुछ लिंक हैं। मैं वर्तमान टेम्प्लेट या url के आधार पर टैब में 'सक्रिय' वर्ग कैसे जोड़ सकता हूं?



4
@AminMeyagani यह प्रश्न कैसे प्रश्न का डुप्लिकेट हो सकता है, जो लगभग एक साल बाद पूछा गया था ?
रीजेंट

जवाबों:


274

URL पर भरोसा किए बिना इसे हल करने का एक तरीका $routeProviderकॉन्फ़िगरेशन के दौरान हर आंशिक में एक कस्टम विशेषता जोड़ना है , जैसे:

$routeProvider.
    when('/dashboard', {
        templateUrl: 'partials/dashboard.html',
        controller: widgetsController,
        activetab: 'dashboard'
    }).
    when('/lab', {
        templateUrl: 'partials/lab.html',
        controller: widgetsController,
        activetab: 'lab'
    });

$routeअपने नियंत्रक में उजागर करें:

function widgetsController($scope, $route) {
    $scope.$route = $route;
}

activeवर्तमान सक्रिय टैब के आधार पर कक्षा निर्धारित करें :

<li ng-class="{active: $route.current.activetab == 'dashboard'}"></li>
<li ng-class="{active: $route.current.activetab == 'lab'}"></li>

3
यह मैंने अब तक देखा सबसे अच्छा समाधान है क्योंकि यह गतिशील यूआरएल जैसे / फू /: बार का समर्थन करता है।
मार्टिनपुलुकी

3
मैं वास्तव में यह काम पाने में सक्षम नहीं है। क्या आप एक plnkr प्रदान करने में सक्षम होंगे?
PPPaul

9
बस एक चीज: बेहतर सेट करें $scope.activeTab = $route.current.activetabताकि आप HTML को थोड़ा साफ रख सकें।
क्रिस्टोफ

2
यह AngularJS 1.0.8 में काम नहीं करता है। $ मार्ग। समवर्ती अपरिभाषित है।
कैटफ़िश

2
$rootScopeइसे नीचे दिए गए @ लुकास की चाल के साथ जोड़कर इसे सभी स्कैप में उपलब्ध कराएं।
कोलिन

134

ऐसा करने का एक तरीका ngClass निर्देश और $ स्थान सेवा का उपयोग करके होगा। अपने टेम्पलेट में आप यह कर सकते हैं:

ng-class="{active:isActive('/dashboard')}"

isActiveइस तरह परिभाषित एक क्षेत्र में एक समारोह कहाँ होगा:

myApp.controller('MyCtrl', function($scope, $location) {
    $scope.isActive = function(route) {
        return route === $location.path();
    }
});

यहाँ पूरा jsField है: http://jsfiddle.net/pkozlowski_opensource/Kzff.net/

ng-class="{active:isActive('/dashboard')}"प्रत्येक नेविगेशन टैब पर दोहराव थकाऊ हो सकता है (यदि आपको कई टैब मिल गए हैं) तो यह तर्क एक बहुत ही सरल निर्देश के लिए एक उम्मीदवार हो सकता है।


1
इससे पहले कि मुझे वास्तव में लिखने के लिए बहुत सरल निर्देश मिले, मुझे बहुत समय लग गया, इसलिए मैंने नीचे एक दिया है। :-) यह विभिन्न संदर्भों में पुन: प्रयोज्य होना चाहिए, जिसमें कोई गैर-घोषणात्मक कॉन्फ़िगरेशन नहीं है।
एक्सएमएल

1
JsFiddle को देखते हुए, आप वर्तमान पृष्ठ को पृष्ठ लोड पर सक्रिय कैसे सेट करते हैं? उदाहरण केवल तभी काम करता है जब कोई उपयोगकर्ता किसी विकल्प पर क्लिक करता है। उदाहरण के लिए, आप बाहरी लिंक से मुखपृष्ठ पर उतरते समय एक 'होम' हाइलाइट कर सकते हैं।
thathurtabit

आह्ह इस पर थोड़ा सा मेरा सर खुजला रहा था। धन्यवाद!
मास्टरवॉक

41

एक कस्टम निर्देश का उपयोग करने के लिए पावेल की सलाह के बाद, यहां एक संस्करण है जिसे रूट-कॉनफिगर के लिए कोई पेलोड जोड़ने की आवश्यकता नहीं है, यह सुपर घोषणापत्र है, और पथ के किसी भी स्तर पर प्रतिक्रिया करने के लिए अनुकूलित किया जा सकता है, बस slice()इसे बदलकर आप किस पर ध्यान दे रहे हैं ।

app.directive('detectActiveTab', function ($location) {
    return {
      link: function postLink(scope, element, attrs) {
        scope.$on("$routeChangeSuccess", function (event, current, previous) {
            /*  
                Designed for full re-usability at any path, any level, by using 
                data from attrs. Declare like this: 
                <li class="nav_tab">
                  <a href="#/home" detect-active-tab="1">HOME</a>
                </li> 
            */

            // This var grabs the tab-level off the attribute, or defaults to 1
            var pathLevel = attrs.detectActiveTab || 1,
            // This var finds what the path is at the level specified
                pathToCheck = $location.path().split('/')[pathLevel] || 
                  "current $location.path doesn't reach this level",
            // This var finds grabs the same level of the href attribute
                tabLink = attrs.href.split('/')[pathLevel] || 
                  "href doesn't include this level";
            // Above, we use the logical 'or' operator to provide a default value
            // in cases where 'undefined' would otherwise be returned.
            // This prevents cases where undefined===undefined, 
            // possibly causing multiple tabs to be 'active'.

            // now compare the two:
            if (pathToCheck === tabLink) {
              element.addClass("active");
            }
            else {
              element.removeClass("active");
            }
        });
      }
    };
  });

हम $routeChangeSuccessघटना को सुनकर अपने लक्ष्यों को पूरा कर रहे हैं , बजाय $watchरास्ते पर रखकर । मैं इस विश्वास के तहत श्रम करता हूं कि इसका मतलब है कि तर्क को कम बार चलना चाहिए, क्योंकि मुझे लगता है कि प्रत्येक $digestचक्र पर आग लगती है।

निर्देश घोषणा पर अपने पथ-स्तरीय तर्क को पारित करके इसे लागू करें। यह निर्दिष्ट करता है कि आप वर्तमान $ location.path () के किस hrefगुण के विरुद्ध अपनी विशेषता का मिलान करना चाहते हैं ।

<li class="nav_tab"><a href="#/home" detect-active-tab="1">HOME</a></li>

इसलिए, यदि आपके टैब को पथ के आधार-स्तर पर प्रतिक्रिया करनी चाहिए, तो तर्क '1' करें। इस प्रकार, जब location.path () "/ होम" है, तो यह "# / होम" के विरुद्ध मेल करेगा href। यदि आपके पास टैब हैं जो दूसरे स्तर पर, या तीसरे या 11 वें पथ पर प्रतिक्रिया करना चाहिए, तो तदनुसार समायोजित करें। 1 या अधिक से यह स्लाइसिंग href में नापाक '#' को दरकिनार कर देगा, जो कि इंडेक्स 0 पर रहेगा।

केवल आवश्यकता यह है कि आप एक पर आह्वान करते हैं <a>, क्योंकि तत्व एक hrefविशेषता की उपस्थिति मान रहा है , जो कि वर्तमान पथ की तुलना करेगा। हालाँकि, आप माता-पिता या बच्चे के तत्व को पढ़ने / लिखने के लिए काफी आसानी से अनुकूलित कर सकते हैं, यदि आप <li>कुछ या पर आक्रमण करना पसंद करते हैं। मैं इसे खोदता हूं क्योंकि आप इसे कई संदर्भों में पुन: उपयोग कर सकते हैं बस pathLevel तर्क को अलग करके। यदि पढ़ने की गहराई तर्क में मान ली गई थी, तो आपको नेविगेशन के कई हिस्सों के साथ उपयोग करने के लिए निर्देश के कई संस्करणों की आवश्यकता होगी।


EDIT 3/18/14: समाधान अपर्याप्त रूप से सामान्यीकृत था, और यदि आप 'activeTab' के मान के लिए एक arg परिभाषित करते हैं जो undefinedदोनों के खिलाफ लौटा है $location.path(), और तत्व है href। क्योंकि: undefined === undefined। उस स्थिति को ठीक करने के लिए अद्यतन किया गया।

उस पर काम करते हुए, मुझे एहसास हुआ कि एक ऐसा संस्करण होना चाहिए था जिसे आप केवल मूल तत्व पर घोषित कर सकते हैं, इस तरह से एक टेम्पलेट संरचना के साथ:

<nav id="header_tabs" find-active-tab="1">
    <a href="#/home" class="nav_tab">HOME</a>
    <a href="#/finance" class="nav_tab">Finance</a>
    <a href="#/hr" class="nav_tab">Human Resources</a>
    <a href="#/quarterly" class="nav_tab">Quarterly</a>
</nav>

ध्यान दें कि यह संस्करण अब बूटस्ट्रैप-शैली HTML जैसा नहीं है। लेकिन, यह अधिक आधुनिक है और कम तत्वों का उपयोग करता है, इसलिए मैं इसके लिए आंशिक हूं। निर्देश का यह संस्करण, और मूल, अब गिथब पर एक ड्रॉप-इन मॉड्यूल के रूप में उपलब्ध है जिसे आप सिर्फ एक निर्भरता के रूप में घोषित कर सकते हैं। अगर किसी ने वास्तव में उनका उपयोग किया है, तो मैं उन्हें बोवर-आइज़ करके खुश रहूंगा।

इसके अलावा, यदि आप एक बूटस्ट्रैप-संगत संस्करण चाहते हैं जिसमें <li>'s' शामिल है , तो आप कोणीय-यूआई-बूटस्ट्रैप टैब्स मॉड्यूल के साथ जा सकते हैं , जो मुझे लगता है कि इस मूल पोस्ट के बाद आया था, और जो शायद इस से भी अधिक घोषणात्मक है। यह बुनियादी सामान के लिए कम संक्षिप्त है, लेकिन आपको कुछ अतिरिक्त विकल्प प्रदान करता है, जैसे कि अक्षम टैब और घोषणात्मक घटनाएं जो सक्रिय और निष्क्रिय होने पर आग लगाती हैं।


4
मैं विश्वास नहीं कर सकता था कि कोई भी वास्तव में इसे वोट नहीं देता है! यहाँ मेरे 2 सेंट है। हालांकि कोड में एक छोटी सी गलती है, मुझे लगता है कि 'tabLvel' को 'activeTab' माना जाता है। और बूटस्ट्रैप शैली के लिए, आप A तत्व के बजाय LI तत्व में 'सक्रिय' वर्ग जोड़ना चाह सकते हैं। लेकिन इसके लिए केवल मामूली बदलाव की जरूरत है।
डेविड लिन

1
आप सक्रियटैब, @DavidLin के बारे में बिल्कुल सही हैं। संपादित। लेकिन, मैं बूटस्ट्रैप की संरचना के साथ प्यार में नहीं हूं, इसलिए वहां एक जानबूझकर अंतर है। वास्तव में, मैं यह सोचना शुरू कर रहा हूं कि नौसेना का सार बिल्कुल नहीं हो सकता है ul, और शायद सिर्फ लंगर का संग्रह होना चाहिए, navया एक अन्य समूह तत्व द्वारा लिपटे हुए होना चाहिए । liबिना किसी अदायगी के मध्यस्थता की परत के साथ व्यवहार को जोड़ा जाता है, विशेष रूप से अब जब हम navअपने निपटान में तत्व को स्पष्ट करते हैं कि यह क्या हो रहा है।
XML

यह सरल और शानदार है। मैं आश्चर्यचकित था कि एंगुलर में पहले से ही कुछ ऐसा नहीं था जिस मार्ग पर आप चल रहे हैं।
इन्टेलिक्स

1
बूटस्ट्र्रा के साथ काम करने के लिए, आपको बस इतना करना है कि `एलिमेंट (एड) को बदलकर` एलिमेंट (एड) को बदल दें। '' मुझे लगता है कि यह बेहतर हो सकता है। हालांकि, कुछ ऐसा है जो सक्रिय-टैब का सक्रिय-टैब है जो टैब को सक्रिय घोषित करता है। अन्यथा, यह एक गंभीर रूप से अच्छा निर्देश है। इस बदलाव को उत्तर में @domi
boatcoder

इस पृष्ठ पर सबसे अच्छा समाधान, विश्वास नहीं कर सकता है कि यह बहुत कम upvotes है।
कारोलिस

27

@ रोब-जुरलिंक मैंने आपके समाधान पर थोड़ा सुधार किया:

प्रत्येक मार्ग के बजाय एक सक्रिय टैब की आवश्यकता होती है; और मुझे ऐसा करने वाले प्रत्येक नियंत्रक में सक्रिय टैब सेट करने की आवश्यकता है:

var App = angular.module('App',[]);
App.config(['$routeProvider', function($routeProvider){
  $routeProvider.
  when('/dashboard', {
    templateUrl: 'partials/dashboard.html',
    controller: Ctrl1
  }).
  when('/lab', {
    templateUrl: 'partials/lab.html',
    controller: Ctrl2
  });
}]).run(['$rootScope', '$location', function($rootScope, $location){
   var path = function() { return $location.path();};
   $rootScope.$watch(path, function(newVal, oldVal){
     $rootScope.activetab = newVal;
   });
}]);

और HTML इस तरह दिखता है। एक्टिवटैब सिर्फ यूआरएल है जो उस रूट से संबंधित है। यह सिर्फ प्रत्येक नियंत्रक में कोड जोड़ने की आवश्यकता को हटा देता है ($ मार्ग और $ rootScope जैसी निर्भरता में खींचकर यदि यह एकमात्र कारण है जिसका वे उपयोग करते हैं)

<ul>
    <li ng-class="{active: activetab=='/dashboard'}">
       <a href="#/dashboard">dashboard</a>
    </li>
    <li ng-class="{active: activetab=='/lab'}">
       <a href="#/lab">lab</a>
    </li>
</ul>

इस संशोधन के लिए बहुत धन्यवाद। बहुत अच्छा। जब पृष्ठ पहले लोड होता है तो क्या आपके पास एक सक्रिय टैब सेट करने के लिए कोई सुझाव है?
बालगामी_मास्टर

2
इस पर निर्भर है कि आपको क्या चाहिए। आम तौर पर आपके पास '' url आपका मुख्य नियंत्रक होगा। इस तरह जब उपयोगकर्ता आपके url पर जाता है, तो वह उस नियंत्रक को लोड करेगा और उस टैब को सक्रिय रूप में सेट करेगा। ऊपर दिए गए उदाहरण में मेरे पास '/' url नहीं है, इसलिए यदि आपके मामले में बस एक .otherwise () $ मार्गप्रोपिडर जोड़ते हैं। जब ('/ डैशबोर्ड', {templateUrl: 'partials / dashboard.html', कंट्रोलर: Ctrl1})। जब ('/ लैब', {टेम्पलेटयूएलआर: 'पार्टिकल्स / लैब.html', कंट्रोलर: Ctrl2})। अन्यथा ({रीडायरेक्टो: '/ डैशबोर्ड'}); शुभकामनाएँ!
लुकास

बहुत धन्यवाद @ लुकास। इससे मदद मिली। किसी कारण से मुझे # प्रतीक को अपने मुख्य मार्ग में जोड़ना पड़ा- जब ('# /', {नियंत्रक: FormController, templateUrl: 'partials / dashboard.html'})।
बालगामी_मास्टर

मैं इस तरह से पसंद करता हूं। एक rootScope होने और जहां भी में कुछ भी
wrivas

16

शायद इस तरह एक निर्देश आपकी समस्या को हल कर सकता है: http://jsfiddle.net/p3ZMR/4/

एचटीएमएल

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

जे एस

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 bot return including hashbang
            scope.location = location;
            scope.$watch('location.path()', function(newPath) {
                if (path === newPath) {
                    element.addClass(clazz);
                } else {
                    element.removeClass(clazz);
                }
            });
        }

    };

}]);

1
ध्यान दें कि आपको $ अवलोकन का उपयोग करना होगा यदि href में एक अभिव्यक्ति है: docs.angularjs.org/guide/directive#Attributes । अपडेटेड
फिडेल

14

सबसे सरल समाधान यहाँ:

कोणीय जेएस के साथ बूटस्ट्रैप नौबार सक्रिय वर्ग कैसे सेट करें?

जो है:

एनजी-व्यू के बाहर सिंगल कंट्रोलर चलाने के लिए एनजी-कंट्रोलर का उपयोग करें:

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

और नियंत्रकों में शामिल हैं। जेएस:

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

2
सहमत, अब तक का सबसे आसान
एंजेलो

12

मैं State.ui मॉड्यूल का उपयोग करने की सलाह देता हूं, जो न केवल कई और नेस्टेड विचारों का समर्थन करता है, बल्कि इस तरह के काम को बहुत आसान बनाता है (नीचे दिए गए कोड):

<ul class="nav">
    <li ng-class="{ active: $state.includes('contacts') }"><a href="#{{$state.href('contacts')}}">Contacts</a></li>
    <li ng-class="{ active: $state.includes('about') }"><a href="#{{$state.href('about')}}">About</a></li>
</ul>

पढ़ने योग्य।


4

यहाँ XMLillies w / domi के LI परिवर्तन का एक और संस्करण है जो पथ स्तर के बजाय खोज स्ट्रिंग का उपयोग करता है। मुझे लगता है कि यह थोड़ा अधिक स्पष्ट है कि मेरे उपयोग के मामले में क्या हो रहा है।

statsApp.directive('activeTab', function ($location) {
  return {
    link: function postLink(scope, element, attrs) {
      scope.$on("$routeChangeSuccess", function (event, current, previous) {
        if (attrs.href!=undefined) { // this directive is called twice for some reason
          // The activeTab attribute should contain a path search string to match on.
          // I.e. <li><a href="#/nested/section1/partial" activeTab="/section1">First Partial</a></li>
          if ($location.path().indexOf(attrs.activeTab) >= 0) {
            element.parent().addClass("active");//parent to get the <li>
          } else {
            element.parent().removeClass("active");
          }
        }
      });
    }
  };
});

HTML अब जैसा दिखता है:

<ul class="nav nav-tabs">
  <li><a href="#/news" active-tab="/news">News</a></li>
  <li><a href="#/some/nested/photos/rawr" active-tab="/photos">Photos</a></li>
  <li><a href="#/contact" active-tab="/contact">Contact</a></li>
</ul>

3

मैंने XMLilley की awser को सबसे अच्छा और सबसे अनुकूलनीय और गैर-घुसपैठ पाया।

हालाँकि मेरे पास एक छोटी सी गड़बड़ थी।

बूटस्ट्रैप नेवी के साथ उपयोग के लिए, यहां बताया गया है कि मैंने इसे कैसे संशोधित किया:

app.directive('activeTab', function ($location) {
    return {
      link: function postLink(scope, element, attrs) {
        scope.$on("$routeChangeSuccess", function (event, current, previous) {
            /*  designed for full re-usability at any path, any level, by using 
                data from attrs
                declare like this: <li class="nav_tab"><a href="#/home" 
                                   active-tab="1">HOME</a></li> 
            */
            if(attrs.href!=undefined){// this directive is called twice for some reason
                // this var grabs the tab-level off the attribute, or defaults to 1
                var pathLevel = attrs.activeTab || 1,
                // this var finds what the path is at the level specified
                    pathToCheck = $location.path().split('/')[pathLevel],
                // this var finds grabs the same level of the href attribute
                    tabLink = attrs.href.split('/')[pathLevel];
                // now compare the two:
                if (pathToCheck === tabLink) {
                  element.parent().addClass("active");//parent to get the <li>
                }
                else {
                  element.parent().removeClass("active");
                }
            }
        });
      }
    };
  });

मैंने जोड़ा "अगर (attrs.href! = अपरिभाषित)" क्योंकि इस फ़ंक्शन को स्पष्ट रूप से दो बार कहा जाता है, एक त्रुटि पैदा करने वाला दूसरी बार।

Html के लिए:

<ul class="nav nav-tabs">
   <li class="active" active-tab="1"><a href="#/accueil" active-tab="1">Accueil</a></li>
   <li><a active-tab="1" href="#/news">News</a></li>
   <li><a active-tab="1" href="#/photos" >Photos</a></li>
   <li><a active-tab="1" href="#/contact">Contact</a></li>
</ul>

एनवीएम, यह मेरी गलती थी यह दो बार कहा जाता था। मुझे लगता है कि "अगर (attrs.href! = अपरिभाषित)" की आवश्यकता नहीं है।
डोमिन

3

बूटस्ट्रैप उदाहरण।

यदि आप रूटिंग (एनजीव्यू) में बनाए गए कोणीय का उपयोग कर रहे हैं तो इस निर्देश का उपयोग किया जा सकता है:

angular.module('myApp').directive('classOnActiveLink', [function() {
    return {
        link: function(scope, element, attrs) {

            var anchorLink = element.children()[0].getAttribute('ng-href') || element.children()[0].getAttribute('href');
            anchorLink = anchorLink.replace(/^#/, '');

            scope.$on("$routeChangeSuccess", function (event, current) {
                if (current.$$route.originalPath == anchorLink) {
                    element.addClass(attrs.classOnActiveLink);
                }
                else {
                    element.removeClass(attrs.classOnActiveLink);
                }
            });

        }
    };
}]);

अपना मार्कअप इस तरह दिखता है:

    <ul class="nav navbar-nav">
        <li class-on-active-link="active"><a href="/orders">Orders</a></li>
        <li class-on-active-link="active"><a href="/distributors">Distributors</a></li>
    </ul>

मुझे यह पसंद है कि आप इसे तब से कर रहे हैं जब आप अपनी विशेषता में इच्छित वर्ग नाम सेट कर सकते हैं।


2

आप बस स्थान को दायरे में इंजेक्ट कर सकते हैं और उपयोग कर सकते हैं कि नेविगेशन के लिए शैली को घटा सकते हैं:

function IndexController( $scope, $rootScope, $location ) {
  $rootScope.location = $location;
  ...
}

फिर इसे अपने में उपयोग करें ng-class:

<li ng-class="{active: location.path() == '/search'}">
  <a href="/search">Search><a/>
</li>

यह $ root.location.path () मार्कअप में नहीं होना चाहिए?
इरशू

@ इरशू: यह संभवत: क्लीनर हो सकता है, लेकिन उपरोक्त दृष्टिकोण ने मेरे लिए भी काम किया।
डेर होकस्टाप्लर

2

एक वैकल्पिक तरीका है ui-sref- सक्रिय का उपयोग करना

जब ui-sref निर्देश की स्थिति सक्रिय होती है, और निष्क्रिय होने पर उन्हें हटाकर एक तत्व में कक्षाएं जोड़ने के लिए ui-sref के साथ एक निर्देश काम करता है। प्राथमिक उपयोग-मामला ui-sref पर निर्भर नेविगेशन मेनू की विशेष उपस्थिति को आसान बनाने के लिए है, "सक्रिय" राज्य का मेनू बटन अलग-अलग दिखाई देता है, इसे निष्क्रिय मेनू आइटम से अलग करता है।

उपयोग:

ui-sref-active = 'class1 class2 class3' - कक्षाएं "class1", "class2", और "class3" प्रत्येक को निर्देश तत्व में जोड़ा जाता है जब संबंधित ui-sref की स्थिति सक्रिय होती है, और इसे निष्क्रिय कर दिया जाता है।

उदाहरण:
निम्नलिखित टेम्पलेट को देखते हुए,

<ul>
  <li ui-sref-active="active" class="item">
    <a href ui-sref="app.user({user: 'bilbobaggins'})">@bilbobaggins</a>
  </li>
  <!-- ... -->
</ul>

जब एप्लिकेशन स्थिति "app.user" हो, और इसमें "बिल्बोबैगिंस" मूल्य वाला राज्य पैरामीटर "उपयोगकर्ता" शामिल हो, जिसके परिणामस्वरूप HTML दिखाई देगा

<ul>
  <li ui-sref-active="active" class="item active">
    <a ui-sref="app.user({user: 'bilbobaggins'})" href="/users/bilbobaggins">@bilbobaggins</a>
  </li>
  <!-- ... -->
</ul>

निर्देश के लिंक समय के दौरान एक बार वर्ग नाम को प्रक्षेपित किया जाता है (प्रक्षेपित मूल्य में किसी भी अन्य परिवर्तन को अनदेखा किया जाता है)। एक अलग-अलग प्रारूप में कई कक्षाएं निर्दिष्ट की जा सकती हैं।

$ State.go () के विकल्प पास करने के लिए ui-sref-opts निर्देश का उपयोग करें। उदाहरण:

<a ui-sref="home" ui-sref-opts="{reload: true}">Home</a>

धन्यवाद। आयनिक ढांचे में काम करते समय यह वास्तव में उपयोगी है!
अविजित गुप्ता

1

मैं नियंत्रक में एक कस्टम विशेषता रखने के बारे में रोब की पोस्ट से सहमत हूं। जाहिर तौर पर मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है। यहाँ jsfiddle से अनुरोध किया गया था:

नमूना html

<div ng-controller="MyCtrl">
    <ul>
        <li ng-repeat="link in links" ng-class="{active: $route.current.activeNav == link.type}"> <a href="{{link.uri}}">{{link.name}}</a>

        </li>
    </ul>
</div>

नमूना app.js

angular.module('MyApp', []).config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/a', {
        activeNav: 'a'
    })
        .when('/a/:id', {
        activeNav: 'a'
    })
        .when('/b', {
        activeNav: 'b'
    })
        .when('/c', {
        activeNav: 'c'
    });
}])
    .controller('MyCtrl', function ($scope, $route) {
    $scope.$route = $route;
    $scope.links = [{
        uri: '#/a',
        name: 'A',
        type: 'a'
    }, {
        uri: '#/b',
        name: 'B',
        type: 'b'
    }, {
        uri: '#/c',
        name: 'C',
        type: 'c'
    }, {
        uri: '#/a/detail',
        name: 'A Detail',
        type: 'a'
    }];
});

http://jsfiddle.net/HrdR6/


मुझे लिंक की सूची में डेटा-संचालित दृष्टिकोण पसंद है। और, कुछ लिंक की सरणी को सेवा / कारखाने में स्थानांतरित करने का विकल्प चुन सकते हैं।
ग्रांट लिंडसे

1
'use strict';

angular.module('cloudApp')
  .controller('MenuController', function ($scope, $location, CloudAuth) {
    $scope.menu = [
      {
        'title': 'Dashboard',
        'iconClass': 'fa fa-dashboard',
        'link': '/dashboard',
        'active': true
      },
      {
        'title': 'Devices',
        'iconClass': 'fa fa-star',
        'link': '/devices'
      },
      {
        'title': 'Settings',
        'iconClass': 'fa fa-gears',
        'link': '/settings'
      }
    ];
    $location.path('/dashboard');
    $scope.isLoggedIn = CloudAuth.isLoggedIn;
    $scope.isAdmin = CloudAuth.isAdmin;
    $scope.isActive = function(route) {
      return route === $location.path();
    };
  });

और टेम्पलेट में नीचे का उपयोग करें:

<li role="presentation" ng-class="{active:isActive(menuItem.link)}" ng-repeat="menuItem in menu"><a href="{{menuItem.link}}"><i class="{{menuItem.iconClass}}"></i>&nbsp;&nbsp;{{menuItem.title}}</a></li>

0

मुझे एक ऐसे समाधान की आवश्यकता थी जिसमें नियंत्रकों में बदलाव की आवश्यकता न हो, क्योंकि कुछ पृष्ठों के लिए हम केवल टेम्पलेट्स को प्रस्तुत करते हैं और कोई भी नियंत्रक नहीं होता है। पिछले टिप्पणीकारों के लिए धन्यवाद जिन्होंने सुझाव दिया कि $routeChangeSuccessमैं कुछ इस तरह से आया हूं:

# Directive
angular.module('myapp.directives')
.directive 'ActiveTab', ($route) ->
  restrict: 'A'

  link: (scope, element, attrs) ->
    klass = "active"

    if $route.current.activeTab? and attrs.flActiveLink is $route.current.activeTab
      element.addClass(klass)

    scope.$on '$routeChangeSuccess', (event, current) ->
      if current.activeTab? and attrs.flActiveLink is current.activeTab
        element.addClass(klass)
      else
        element.removeClass(klass)

# Routing
$routeProvider
.when "/page",
  templateUrl: "page.html"
  activeTab: "page"
.when "/other_page",
  templateUrl: "other_page.html"
  controller: "OtherPageCtrl"
  activeTab: "other_page"

# View (.jade)
a(ng-href='/page', active-tab='page') Page
a(ng-href='/other_page', active-tab='other_page') Other page

यह यूआरएल पर निर्भर नहीं करता है और इस प्रकार किसी भी उप पेज आदि के लिए इसे सेट करना वास्तव में आसान है।


0

मुझे याद नहीं है कि मुझे यह तरीका कहाँ से मिला, लेकिन यह बहुत सरल है और अच्छी तरह से काम करता है।

HTML:

<nav role="navigation">
    <ul>
        <li ui-sref-active="selected" class="inactive"><a ui-sref="tab-01">Tab 01</a></li> 
        <li ui-sref-active="selected" class="inactive"><a ui-sref="tab-02">Tab 02</a></li>
    </ul>
</nav>

सीएसएस:

  .selected {
    background-color: $white;
    color: $light-blue;
    text-decoration: none;
    border-color: $light-grey;
  } 

0

यदि आप ngRoute (रूटिंग के लिए) का उपयोग कर रहे हैं, तो आपके आवेदन का विन्यास नीचे होगा,

angular
  .module('appApp', [
    'ngRoute'
 ])
config(function ($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl',
        controllerAs: 'main'
      })
      .when('/about', {
        templateUrl: 'views/about.html',
        controller: 'AboutCtrl',
        controllerAs: 'about'
      })
}
});

अब, इस विन्यास में नियंत्रक को नीचे की तरह ही जोड़ें,

angular
      .module('appApp', [
        'ngRoute'
     ])
    config(function ($routeProvider) {
        $routeProvider
          .when('/', {
            templateUrl: 'views/main.html',
            controller: 'MainCtrl',
            activetab: 'main'
          })
          .when('/about', {
            templateUrl: 'views/about.html',
            controller: 'AboutCtrl',
            activetab: 'about'
          })
    }
    })
  .controller('navController', function ($scope, $route) {
    $scope.$route = $route;
  });

जैसा कि आपने अपने कॉन्फ़िगरेशन में सक्रिय टैब का उल्लेख किया है, अब आपको बस अपने <li>या <a>टैग में सक्रिय वर्ग जोड़ना होगा । पसंद,

ng-class="{active: $route.current.activetab == 'about'}"

जिसका अर्थ है, जब भी उपयोगकर्ता पृष्ठ के बारे में क्लिक करता है, तो यह स्वचालित रूप से वर्तमान टैब की पहचान करेगा और सक्रिय सीएसएस कक्षा को लागू करेगा।

आशा है कि ये आपकी मदद करेगा!


-3

समाधान के लिए यहां आया था .. हालांकि उपरोक्त समाधान ठीक काम कर रहे हैं, लेकिन उन्हें थोड़ा जटिल अनावश्यक पाया गया। उन लोगों के लिए जो अभी भी एक आसान और साफ समाधान की तलाश कर रहे हैं, यह पूरी तरह से कार्य करेगा।

<section ng-init="tab=1">
                <ul class="nav nav-tabs">
                    <li ng-class="{active: tab == 1}"><a ng-click="tab=1" href="#showitem">View Inventory</a></li>
                    <li ng-class="{active: tab == 2}"><a ng-click="tab=2" href="#additem">Add new item</a></li>
                    <li ng-class="{active: tab == 3}"><a ng-click="tab=3" href="#solditem">Sold item</a></li>
                </ul>
            </section>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.