AngularJS এর ​​সাথে সক্রিয় ট্যাব শৈলী সেট করুন


144

আমি কৌনিক জেএসে এর মতো রুট সেট করেছি:

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

ট্যাব হিসাবে স্টাইলযুক্ত টপবারে আমার কয়েকটি লিঙ্ক রয়েছে। বর্তমান টেম্পলেট বা url এর উপর নির্ভর করে আমি কীভাবে একটি ট্যাবটিতে 'সক্রিয়' শ্রেণি যুক্ত করতে পারি?



4
@ অ্যামনেমেঘানি এই প্রশ্নটি কীভাবে নকল হতে পারে, প্রায় বছর পরে জিজ্ঞাসা করা হয়েছিল ?
রিজেন্ট

উত্তর:


274

ইউআরএলগুলির উপর নির্ভর না করেই এর সমাধানের উপায় হ'ল $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
এটি এ পর্যন্ত সেরা সমাধান যা আমি দেখেছি কারণ এটি / foo /: বারের মতো গতিশীল url সমর্থন করে।
মার্টিনপলুচি

3
আমি আসলে এই কাজ পেতে সক্ষম হইনি। আপনি একটি plnkr প্রদান করতে সক্ষম হবে?
পিপিপিউল

9
কেবল একটি জিনিস: আরও ভাল সেট করুন $scope.activeTab = $route.current.activetabযাতে আপনি এইচটিএমএলকে একটু পরিষ্কার রাখতে পারেন।
ক্রিস্টোফ

2
এটি AngularJS 1.0.8 এ কাজ করে না। .c রুট.কন্টেন্ট অপরিজ্ঞাত।
ক্যাটফিশ

2
$rootScopeএটি সমস্ত স্কোপে উপলব্ধ করার জন্য নীচে @ লুকাশের কৌশলটির সাথে এটি একত্রিত করুন ।
কল্লিন

134

এটি করার একটি উপায় হ'ল এনজি ক্লাস নির্দেশিকা এবং $ অবস্থান পরিষেবাটি ব্যবহার করে। আপনার টেমপ্লেটে আপনি করতে পারেন:

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

যেখানে isActiveএটির মতো সংজ্ঞায়িত স্কোপের কোনও ফাংশন হবে:

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

এখানে সম্পূর্ণ jsFizz: http://jsfiddle.net/pkozlowski_opensource/KzAfG/

ng-class="{active:isActive('/dashboard')}"প্রতিটি নেভিগেশন ট্যাবে পুনরাবৃত্তি করা ক্লান্তিকর হতে পারে (যদি আপনি অনেকগুলি ট্যাব পেয়ে থাকেন) তাই এই যুক্তিটি খুব সাধারণ নির্দেশের প্রার্থী হতে পারে।


1
লিখতে খুব সহজ হতে 'খুব সাধারণ দিকনির্দেশনা' খুঁজে পাওয়ার আগে আমাকে অনেক দিন লেগেছে, তাই আমি নীচে একটি সরবরাহ করেছি। :-) অ-ঘোষণামূলক কনফিগারেশন ছাড়াই এটি বিভিন্ন প্রসঙ্গে পুনরায় ব্যবহারযোগ্য হওয়া উচিত।
এক্সএমএল

1
জেএসফিডেলের দিকে তাকিয়ে আপনি কীভাবে বর্তমান পৃষ্ঠা পৃষ্ঠা পৃষ্ঠায় সক্রিয় সেট করবেন? উদাহরণটি তখনই কার্যকর হয় যখন কোনও ব্যবহারকারী কোনও বিকল্প ক্লিক করে। উদাহরণস্বরূপ, কোনও বহিরাগত লিঙ্ক থেকে হোমপৃষ্ঠায় অবতরণ করার সময় আপনি একটি 'হোম' ন্যাভটি হাইলাইট করতে পারেন।
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চক্রকে আগুন দেখায় ।

নির্দেশের ঘোষণায় আপনার পথ-স্তরের যুক্তিটি পাস করে এটি চাওয়া vo এটি বর্তমান ies অবস্থান.পাথ () এর কোন অংশের hrefবিপরীতে আপনার বৈশিষ্ট্যটির সাথে মিল রাখতে চায় তা নির্দিষ্ট করে।

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

সুতরাং, যদি আপনার ট্যাবগুলি যদি পথের বেস-স্তরে প্রতিক্রিয়া দেখাতে পারে তবে আর্গুমেন্টটি '1' করুন make সুতরাং, যখন অবস্থান.path () "/ home" হয় তখন এটি "# / home" এর সাথে মিলবে href। আপনার যদি এমন ট্যাব থাকে যা দ্বিতীয় স্তরের, বা তৃতীয়, বা 11 তম পথের প্রতিক্রিয়া দেখা উচিত, সেই অনুসারে সামঞ্জস্য করুন। 1 বা ততোধিকের থেকে এই টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো।

কেবলমাত্র প্রয়োজনটি হ'ল আপনি একটিতে প্রার্থনা করুন <a>, কারণ উপাদানটি কোনও hrefবৈশিষ্ট্যের উপস্থিতি ধরে নিচ্ছে, যা এটি বর্তমান পথের সাথে তুলনা করবে। যাইহোক, আপনি কোনও অভিভাবক বা সন্তানের উপাদান পড়তে / লিখতে মোটামুটি সহজে মানিয়ে নিতে পারেন, যদি আপনি <li>বা কোনও কিছুতে প্রার্থনা করতে পছন্দ করেন । আমি এটি খনন করেছি কারণ আপনি কেবলমাত্র পথচলা আর্গুমেন্টের পরিবর্তিত করে অনেক প্রসঙ্গে এটি পুনরায় ব্যবহার করতে পারেন। পড়ার গভীরতা যদি যুক্তিতে অনুমান করা হয়, আপনি নেভিগেশনের একাধিক অংশ ব্যবহারের জন্য নির্দেশিকার একাধিক সংস্করণ প্রয়োজন need


সম্পাদনা 3/18/14: সমাধানটি অপর্যাপ্তভাবে সাধারণীকরণ করা হয়েছিল, এবং যদি আপনি 'অ্যাক্টিভ্যাব' এর মান , এবং উপাদানটির undefinedবিপরীতে ফিরে আসার জন্য কোনও যুক্তিকে সংজ্ঞায়িত করেন তবে সক্রিয় হবে । কারণ: । এই শর্তটি ঠিক করতে আপডেট হয়েছে।$location.path()hrefundefined === 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>আপনি কৌণিক-ইউআই-বুটস্ট্র্যাপ ট্যাব মডিউলটি নিয়ে যেতে পারেন , যা আমার মনে হয় এই মূল পোস্টের পরে প্রকাশিত হয়েছিল এবং এটি সম্ভবত এটির চেয়ে আরও বেশি ঘোষিত। এটি বেসিক স্টাফগুলির জন্য কম সংক্ষিপ্ত নয়, তবে আপনাকে কিছু অতিরিক্ত বিকল্প সরবরাহ করে, যেমন অক্ষম ট্যাব এবং ঘোষিত ইভেন্টগুলি যা অ্যাক্টিভেট এবং নিষ্ক্রিয় করে।


4
আমি বিশ্বাস করতে পারি না কেউ আসলে এটিকে একটি ভোট দেয়! এখানে আমার 2 সেন্ট। কোডটিতে একটি ছোট্ট ভুল হলেও, আমি মনে করি যে 'ট্যাবলেভেল' 'অ্যাক্টিভ ট্যাব' হওয়ার কথা। এবং বুটস্ট্র্যাপ শৈলীর জন্য, আপনি 'অ্যাক্টিভ' ক্লাসটি এল এলিমেন্টের পরিবর্তে এল উপাদানটির সাথে যুক্ত করতে চাইতে পারেন। তবে এর জন্য কেবল সামান্য পরিবর্তন দরকার।
ডেভিড লিন

1
আপনি অ্যাক্টিভ্যাটব, ডেভিডলিন সম্পর্কে একেবারে সঠিক। সম্পাদনা করা হয়েছে। তবে, আমি বুটস্ট্র্যাপের কাঠামোর সাথে প্রেম করি না, সুতরাং সেখানে ইচ্ছাকৃত পার্থক্য রয়েছে। প্রকৃতপক্ষে, আমি ভাবতে শুরু করেছি যে নাভি বিমূর্ততাগুলি মোটেও অন্তর্ভুক্ত নাও হতে পারে ul, এবং সম্ভবত কেবল একটি নোঙ্গর সংগ্রহ করা উচিত, কোনও navবা অন্য গ্রুপিং উপাদান দ্বারা মোড়ানো । এর মধ্যস্থতাকার স্তরটির সাথে লেনদেন liছাড়াই কোনও জটিলতা যুক্ত করা হয়েছে, বিশেষত এখন navআমাদের কী আছে তা পরিষ্কার করার জন্য আমাদের কাছে উপাদান রয়েছে।
এক্সএমএল

এটি সহজ এবং উজ্জ্বল। আমি অবাক হয়ে গিয়েছিলাম যে আপনি যে রুটে চলেছেন তা যাচাই করার জন্য ইতিমধ্যে অ্যাঙ্গুলারে এমন কিছু ছিল না।
ইন্টেলিক্স

1
এটিকে বুটস্ট্র্যাপ ৩. দিয়ে কাজ করতে, আপনাকে যা করতে হবে তা হ'ল। এলিমেন্ট.এডিডি ক্লাস ("সক্রিয়"); `থেকে` এলিমেন্ট.প্যারেন্ট ('লী')। অ্যাডক্লাস ("অ্যাক্টিভ"); `আমার মনে হয় এটি আরও ভাল হতে পারে যদিও ভালো কিছু নামে, হয়-সক্রিয়-ট্যাব এর insead সক্রিয়-ট্যাব যা ডিক্লেয়ার ট্যাব সক্রিয় মনে হচ্ছে। অন্যথায়, এটি একটি গুরুতর সুন্দর দিকনির্দেশনা। @ মমি
নৌকা কোডার

এই পৃষ্ঠার সর্বোত্তম সমাধান, এটি এত সামান্য পরিমাণে বিশ্বাস করতে পারে না।
কারোলিস

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

এবং এইচটিএমএল দেখে মনে হচ্ছে। অ্যাক্টিভেটব কেবল সেই url যা সেই রুটের সাথে সম্পর্কিত। এটি কেবলমাত্র প্রতিটি নিয়ামককে কোড যুক্ত করার প্রয়োজনীয়তা সরিয়ে দেয় (used রুট এবং $ রুটস্কোপের মতো নির্ভরতাগুলিতে টানতে যদি এটি ব্যবহার করা হয় তবে এটিই একমাত্র কারণ)

<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
আপনি কি চান তার উপর নির্ভর করছে. সাধারণত আপনি '/' ইউআরএল আপনার প্রধান নিয়ামক হতে চান। ব্যবহারকারী যখন আপনার ইউআরএল এ যান, তখন সেই নিয়ামকটি লোড হবে এবং সেই ট্যাবটিকে সক্রিয় হিসাবে সেট করবে। উপরের উদাহরণে আমার কাছে '/' ইউআরএল নেই, সুতরাং আপনার ক্ষেত্রে যদি এটি হয় তবে কেবল একটি। অন্যরকম () $ রুটপ্রভাইডার যুক্ত করুন। কখন ('/ ড্যাশবোর্ড', {টেম্পলেট ইউআরএল: 'পার্টিয়ালস / ড্যাশবোর্ড এইচটিএমএল', নিয়ামক: Ctrl1})। কখন ('/ ল্যাব', {টেম্পলেট ইউআরএল: 'পার্টিয়াল / ল্যাব এইচটিএমএল', নিয়ামক: Ctrl2}) otherwise অন্যথায় ({redirectTo: '/ ড্যাশবোর্ড'}); ভাগ্য সুপ্রসন্ন হোক!
লুকাস

অনেক ধন্যবাদ @ লুকাস। যে সাহায্য করেছে। কিছু কারণ আমাকে আমার প্রধান রুটে # চিহ্ন যুক্ত করতে হয়েছিল- যখন ('# /', {নিয়ামক: ফর্মসন্ট্রোলার, টেম্পলেট ইউআরএল: 'পার্টিয়ালস / ড্যাশবোর্ড। Html'।)।
হেয়ারগামি_মাস্টার

আমি এইভাবে পছন্দ। একটি রুটস্কোপ রয়েছে এবং যে কোনও জায়গায় যে কোনও কিছু করুন
অরিভাস

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 এর মধ্যে একটি অভিব্যক্তি রয়েছে কিনা তা পর্যবেক্ষণ করতে হবে: ডকস.আঙ্গুলারজেএস.আর / গাইড / নির্দেশিকা # অ্যাট্রিবিউটস । আপডেট হওয়া ফ্রেড
নররেটজ

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>

এবং নিয়ন্ত্রণকারীদের মধ্যে অন্তর্ভুক্ত করুন। js:

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

এখানে এক্সএমিলিলিজ ডাব্লু / ডোমির এলআই পরিবর্তনের আরও একটি সংস্করণ যা কোনও পাথ স্তরের পরিবর্তে অনুসন্ধান স্ট্রিং ব্যবহার করে। আমি মনে করি এটি আমার ব্যবহারের ক্ষেত্রে কী ঘটছে তা আরও কিছুটা স্পষ্ট।

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

এইচটিএমএল এখন দেখায়:

<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

আমি এক্সএমিলির অ্যাঞ্জারটিকে সেরা এবং সর্বাধিক অভিযোজিত এবং অ-অনুপ্রবেশকারী পেয়েছি।

তবে আমার একটা ছোট সমস্যা ছিল।

বুটস্ট্র্যাপ নাভির সাথে ব্যবহারের জন্য, আমি এখানে এটি কীভাবে পরিবর্তন করেছি:

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

আমি "if ((attrs.href! = অপরিবর্তিত))" যুক্ত করেছি কারণ এই ফাংশনটি তাত্ক্ষণিকভাবে দু'বার বলা হয়ে থাকে, দ্বিতীয়বার ত্রুটি তৈরি করে।

এইচটিএমএল হিসাবে:

<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! = অপরিজ্ঞাত)" প্রয়োজন হয় না।
domi

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-active = 'class1 class2 Class3' - ক্লাস "Class1", "class2", এবং "class3" প্রতিটি যুক্ত আইআই-সেরেফের সক্রিয় অবস্থায় থাকার সময় নির্দেশের উপাদানটিতে যুক্ত হয় এবং যখন এটি নিষ্ক্রিয় থাকে তখন সরানো হয়।

উদাহরণ:
নিম্নলিখিত টেমপ্লেট দেওয়া,

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

যখন অ্যাপের স্থিতিটি "app.user" হয় এবং এতে "বিল্বোব্যাগগিনস" মান সহ স্টেট প্যারামিটার "ব্যবহারকারী" থাকে, ফলস্বরূপ এইচটিএমএল প্রদর্শিত হবে

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

নির্দেশের লিঙ্ক সময় চলাকালীন ক্লাসের নামটি একবার বিভক্ত হয় (ইন্টারপোল্টেড মানটিতে আরও কোনও পরিবর্তন উপেক্ষা করা হয়)। একাধিক ক্লাস স্পেস-বিভাজিত বিন্যাসে নির্দিষ্ট করা যেতে পারে।

Options state.go () এ বিকল্পগুলি পাস করার জন্য ui-sref-opts নির্দেশিকা ব্যবহার করুন। উদাহরণ:

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

ধন্যবাদ। আয়নিক কাঠামোয় কাজ করার সময় এটি সত্যিই দরকারী!
অভিজিৎ গুপ্ত

1

আমি নিয়ামকটিতে একটি কাস্টম বৈশিষ্ট্য থাকার বিষয়ে রবের পোস্টের সাথে একমত। স্পষ্টতই আমার মন্তব্য করার মতো যথেষ্ট প্রতিবেদন নেই। অনুরোধ করা হয়েছিল যে জিসফিল এখানে:

নমুনা এইচটিএমএল

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


আমি লিঙ্কগুলির তালিকায় ডেটা চালিত পদ্ধতির পছন্দ করি। এবং, কিছু লিঙ্কগুলির অ্যারেটিকে কোনও পরিষেবা / কারখানায় স্থানান্তর করতে পছন্দ করতে পারে।
গ্রান্ট লিন্ডসে 21

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

এটি ইউআরএলগুলির উপর নির্ভর করে না এবং সুতরাং এটি কোনও উপ পৃষ্ঠাগুলির জন্য সেট আপ করা সত্যিই সহজ etc.


0

আমি এই পদ্ধতিটি কোথায় পেয়েছি তা মনে করতে পারি না তবে এটি বেশ সহজ এবং ভালভাবে কাজ করে।

এইচটিএমএল:

<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

আপনি যদি এনজিআরট (রাউটিংয়ের জন্য) ব্যবহার করছেন তবে আপনার অ্যাপ্লিকেশনটির নীচে কনফিগারেশন থাকবে,

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'}"

যার অর্থ, যখনই ব্যবহারকারীরা প্রায় পৃষ্ঠায় ক্লিক করেন, এটি স্বয়ংক্রিয়ভাবে বর্তমান ট্যাবটি সনাক্ত করবে এবং সক্রিয় CSS শ্রেণি প্রয়োগ করবে।

আশা করি এটা কাজে লাগবে!


-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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.