অ্যাঙ্গুলার জেএস সহ বুটস্ট্র্যাপ নববার সক্রিয় ক্লাসটি কীভাবে সেট করবেন?


306

আইটেমগুলি সহ আমার যদি বুটস্ট্র্যাপে একটি নববার থাকে

Home | About | Contact

প্রতিটি মেনু আইটেম সক্রিয় থাকাকালীন আমি কীভাবে সক্রিয় ক্লাস সেট করব? এটি হল, class="active"কৌণিক রুটটি যখন হয় তখন আমি কীভাবে সেট করতে পারি

  1. #/ বাড়ির জন্য
  2. #/about প্রায় পৃষ্ঠার জন্য
  3. #/contact যোগাযোগ পৃষ্ঠার জন্য


10
এটি অনুরূপ, তবে নেভিগেশন বোতামগুলি হাইলাইট করার কোনও "কৌণিক উপায়" নয়।
ব্যবহারকারী 1876508


আপনি যদি কৌণিক রাউটিং ব্যবহার করছেন , দয়া করে নোট করুন যে নিখুঁত উত্তরটি নীচে নীচে সমাহিত করা হয়েছে: stackoverflow.com/a/43822400/474189
ডানকান জোন্স

উত্তর:


598

খুব মার্জিত উপায় হল এনজি-ভিউয়ের বাইরে একটি একক নিয়ামক চালাতে এনজি-কন্ট্রোলার ব্যবহার করা:

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

10
যেহেতু আমি এতে নতুন তাই আমি কীভাবে প্রশংসা করব যদি আপনি এটির শিরোনামের নির্দেশিকাতে কীভাবে উদাহরণ স্থাপন করতে পারেন তবে দয়া করে।
mono68

41
আমি return $location.path().indexOf(viewLocation) == 0;পরিবর্তে ব্যবহারের পরামর্শ দিচ্ছি যাতে আপনি পরামিতিগুলির সাথে পৃষ্ঠাগুলিও ধরতে পারেন
সুইভেন হ্যাচট

7
এটি কাজটি সম্পন্ন করেছে তবে খুব কষ্ট সহকারে elegant- রুটের নাম যেমন /dogsকলটিতে নকল করতে হবেisActive('/dogs')
ওয়াল

7
আপনি যদি ইউআই রাউটার ব্যবহার করেন তবে আপনি ui-sref-active/ui-sref-active-eqনির্দেশিকা ব্যবহার করতে পারেন , যেমন। ui-sref-active-eq='active'বা ui-sref-active='active'একই ফলাফল অর্জন করতে
ড্যান প্যান্ট্রি

10
@ স্পেনহ্যাচট সেই যুক্তিটির সাথে উদ্বেগটি হ'ল হোম পেজের লিঙ্কটি (/) অন্য সমস্ত পথে মেলে।
এমওয়ুতন

51

আমি এটি হ্যান্ডেল করার জন্য কেবল একটি নির্দেশিকা লিখেছি, যাতে আপনি কেবলমাত্র bs-active-linkমূল <ul>উপাদানটির সাথে বৈশিষ্ট্যটি যুক্ত করতে পারেন এবং যে কোনও সময় রুটটি পরিবর্তিত হলে এটি মিলবে লিঙ্কটি খুঁজে পেতে এবং activeসংশ্লিষ্টটিকে ক্লাস যুক্ত করতে পারেন<li>

আপনি এটি এখানে ক্রিয়াতে দেখতে পারেন: http://jsfiddle.net/8mcedv3b/

এইচটিএমএল উদাহরণ:

<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
আমি এটি গ্রহণযোগ্য উত্তরের চেয়ে বেশি পছন্দ করি কারণ কনফিগার
ডেটারের সদৃশতা নেই

1
উপর ( "$ routeChangeSuccess" সুযোগ পরিবর্তে আমাকে সুযোগ ব্যবহার করার জন্য কাজ করেন $ ওয়াচ ( "$ routeChangeSuccess", ফাংশন () {.... $, ফাংশন ()
aemad

আমার নিজের উদ্দেশ্যে এই সামান্য কিছু টুইট করতে হয়েছিল, কিন্তু দুর্দান্ত উত্তর! বোঝার পক্ষে যথেষ্ট সহজ।
টনি আনজিয়ানো

38

আপনি AngularStrapএকবার দেখতে পারেন, নাবার বার্তাটি আপনি যা খুঁজছেন তা মনে হচ্ছে:

https://github.com/mgcrea/angular-strap/blob/master/src/navbar/navbar.js

.directive('bsNavbar', function($location) {
  'use strict';

  return {
    restrict: 'A',
    link: function postLink(scope, element, attrs, controller) {
      // Watch for the $location
      scope.$watch(function() {
        return $location.path();
      }, function(newValue, oldValue) {

        $('li[data-match-route]', element).each(function(k, li) {
          var $li = angular.element(li),
            // data('match-rout') does not work with dynamic attributes
            pattern = $li.attr('data-match-route'),
            regexp = new RegExp('^' + pattern + '$', ['i']);

          if(regexp.test(newValue)) {
            $li.addClass('active');
          } else {
            $li.removeClass('active');
          }

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

এই নির্দেশনাটি ব্যবহার করতে:

  1. ডাউনলোড AngularStrap থেকে http://mgcrea.github.io/angular-strap/

  2. বুটস্ট্র্যাপ.জেএস এর পরে আপনার পৃষ্ঠায় স্ক্রিপ্টটি অন্তর্ভুক্ত করুন:
    <script src="lib/angular-strap.js"></script>

  3. আপনার মডিউলটিতে নির্দেশিকা যুক্ত করুন:
    angular.module('myApp', ['$strap.directives'])

  4. আপনার নাবারটিতে নির্দেশিকা যুক্ত করুন:
    <div class="navbar" bs-navbar>

  5. প্রতিটি ন্যাভ আইটেমটিতে রেজিেক্সস যুক্ত করুন:
    <li data-match-route="/about"><a href="#/about">About</a></li>


1
ধন্যবাদ। এটি আমাকে আমার নিজের নির্দেশিকা ঠিক করতে সহায়তা করেছিল (আমার জন্য অনুপস্থিত অন্তর্দৃষ্টিটি ছিল scope.$watch)
এনগুরে নাইগা

কেন elementভেরিয়েবলটি jquery সিলেক্টরের কাছে পাস হয়? $('...', element)
লুসিও

@ লুসিও পদ্ধতিটিতে 2 টি আর্গুমেন্ট লাগে - jQuery (নির্বাচক, প্রসঙ্গ) - দ্বিতীয় যুক্তিটি নির্বাচকের প্রসঙ্গটি পাস করতে হয়, হয় পিতামাতার
ডিওএম

এটি আমার জন্য নিখুঁতভাবে কাজ করে - আমাকে অবশ্য একবার পরিবর্তন করতে হয়েছিল, আপনার মডিউলে যোগ করার নির্দেশনাটি প্রতি মাইক্রক্রিয়া . github.io/angular- স্ট্র্যাপmgcrea.ngStrap নয়$strap.directives
ভিক্সক্সড

33

এখানে একটি সাধারণ পদ্ধতির যা কৌণিকর সাথে ভালভাবে কাজ করে।

<ul class="nav navbar-nav">
    <li ng-class="{ active: isActive('/View1') }"><a href="#/View1">View 1</a></li>
    <li ng-class="{ active: isActive('/View2') }"><a href="#/View2">View 2</a></li>
    <li ng-class="{ active: isActive('/View3') }"><a href="#/View3">View 3</a></li>
</ul>

আপনার AngularJS নিয়ামকের মধ্যে:

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

2
চমৎকার পন্থা। আমি এটিকে কিছুটা সংশোধন করেছি - ব্যবহৃত এনজি-ক্লাস নির্দেশিকা (এনজি-ক্লাস = {সক্রিয়: ইসঅ্যাকটিভ ('/ ভিউ 1')}) এবং ক্লাসের নামের পরিবর্তে সত্য / মিথ্যা ফিরিয়ে আনতে আইসিটিভ ফাংশন আপডেট করেছি।
পেটেলসান

আমি আপনার উদাহরণের মতো সমস্ত কিছু অনুলিপি করেছি এবং আমার জন্য $ লোকেশন.পাথ () কাজ করে নি ...। লোকেশন.আরল () এ স্যুইচ করেছে, এবং এটি কাজ করেছে!
পাওলো অলিভিরা

14

আপনি যদি কৌনিক রাউটারের সাথে কাজ করছেন, রাউটারলিঙ্কএকটিভ নির্দেশিকা সত্যই মার্জিতভাবে ব্যবহার করা যেতে পারে:

<ul class="navbar-nav">
  <li class="nav-item"><a class="nav-link" routerLink="home" routerLinkActive="active">Home</a></li>
  <li class="nav-item"><a class="nav-link" routerLink="gallery" routerLinkActive="active">Gallery</a></li>
  <li class="nav-item"><a class="nav-link" routerLink="pricing" routerLinkActive="active">Prices</a></li>
  <li class="nav-item"><a class="nav-link" routerLink="contact" routerLinkActive="active">Contact</a></li>
</ul>

2
আমি মনে করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত (কমপক্ষে কৌণিক 2+ এর জন্য), কেন ইতিমধ্যে কিছু বাস্তবায়ন করা হয়েছে? তবে বুটস্ট্র্যাপ ৩.৩ এর জন্য activeক্লাসটি হওয়া উচিত <li>(আপনি রাউটারলিঙ্ক বা তার পিতামাতার সাথে রাউটারলিঙ্কটিভ রাখতে পারেন)
ফোনিক্স

3
দ্রষ্টব্য: আপনি যদি /নিজের হোম পৃষ্ঠা হিসাবে ব্যবহার করেন তবে routerLinkActiveযে কোনও ইউআরএল /, উদাহরণস্বরূপ /foo/, /foo/barইত্যাদি দিয়ে শুরু করে সেই সক্রিয় বিবেচনা করবেন , ঠিক মিলতে গেলে আপনার প্রয়োজন routerLinkActive="active" [routerLinkActiveOptions]="{exact:true}"
ডানকান জোন্স

8

প্রথম এবং সর্বাগ্রে, এই সমস্যাটি অনেক উপায়ে সমাধান করা যেতে পারে। এই উপায়টি সবচেয়ে মার্জিত নাও হতে পারে তবে এটি সত্যই কাজ করে।

এখানে একটি সহজ সমাধান আপনার কোনও প্রকল্পে যুক্ত করতে সক্ষম হওয়া উচিত। আপনি যখন নিজের রুটটি কী-অফ করতে ব্যবহার করতে পারেন তখন কনফিগার করার সময় আপনি কেবল একটি "পেজকে" বা অন্য কোনও সম্পত্তি যুক্ত করতে পারেন। অতিরিক্তভাবে, আপনি কোনও রুট পরিবর্তনের সফল সমাপ্তির জন্য শোনার জন্য $ রুট অবজেক্টের $ রুটচ্যাঞ্জস্যাক্সেস পদ্ধতিতে শ্রোতার প্রয়োগ করতে পারেন।

যখন আপনার হ্যান্ডলারটি জ্বলতে থাকে তখন আপনি পৃষ্ঠা কীটি পান এবং এই পৃষ্ঠার জন্য "সক্রিয়" হওয়া দরকার এমন উপাদানগুলি সনাক্ত করতে সেই কীটি ব্যবহার করুন এবং আপনি অ্যাক্টিভ শ্রেণি প্রয়োগ করেন।

মনে রাখবেন আপনার সমস্ত উপাদান "IN ACTIVE" তৈরি করার একটি উপায় প্রয়োজন need আপনি দেখতে পাচ্ছেন যে আমি আমার এনএভি আইটেমগুলিতে সেগুলিকে বন্ধ করার জন্য। পৃষ্ঠার কী ক্লাসটি ব্যবহার করছি এবং আমি পৃথকভাবে সেগুলি চালু করার জন্য .পেজকি_ {পৃষ্ঠাগুলি using ব্যবহার করছি। এগুলিকে নিষ্ক্রিয় অবস্থায় সরিয়ে ফেলা, একটি নির্বোধ দৃষ্টিভঙ্গি হিসাবে বিবেচিত হবে, সম্ভবত আপনি কেবলমাত্র সক্রিয় আইটেমগুলিকে নিষ্ক্রিয় করতে পূর্ববর্তী রুটটি ব্যবহার করে আরও ভাল পারফরম্যান্স পাবেন, অথবা আপনি সক্রিয় আইটেমকে নিষ্ক্রিয় করার জন্য কেবল জিকারি নির্বাচককে পরিবর্তন করতে পারেন। সমস্ত সক্রিয় আইটেম নির্বাচন করতে jquery ব্যবহার করা সম্ভবত সেরা সমাধান কারণ এটি নিশ্চিত করে যে পূর্ববর্তী রুটে উপস্থিত থাকা কোনও CSS বাগের ক্ষেত্রে বর্তমান রুটের জন্য সমস্ত কিছু পরিষ্কার করা হয়েছে।

যার অর্থ কোডের এই লাইনটি পরিবর্তন করা হবে:

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

এই এক

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

এখানে কিছু নমুনা কোড রয়েছে:

এর একটি বুটস্ট্র্যাপ নববার দেওয়া হয়েছে

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

রুটগুলির মূল মানগুলি দেখতে আপনাকে ডানদিকে স্ক্রোল করতে হবে, এটিই এই পুরো সমাধানের মূল বিষয়।
র‌্যাম্প51

16
এটি কার্যকর হতে পারে তবে Angular.js অ্যাপ্লিকেশনগুলির সাধারণ পরামর্শের পরিপন্থী: কৌণিক ক্ষেত্রে আপনাকে jQuery ব্যবহার করে DOM এর সাথে গোলযোগ করা থেকে বিরত থাকতে হবে; আপনার যদি ডিওএম টাচ করতে হয় তবে একটি নির্দেশিকা লিখুন।
পাওলো স্কার্ডাইন

এটি নিখুঁত, যদি ডোম ম্যানিপুলেশন আপনাকে বিরক্ত করে, কেবলমাত্র .navbar এ একটি নির্দেশিকা যুক্ত করুন, route রুট চেঞ্জেসেসে ব্রডকাস্ট ইভেন্ট যুক্ত করুন, $ রুটস্কোপ $ সম্প্রচার ('রুট চেঞ্জড', কারেন্ট.পেজকি); এবং তারপরে এটি আপনার নির্দেশে ক্যাপচার করুন এবং সেখানে ডোম ম্যানিপুলেশন করুন
ইরশু

7

আপনি প্রকৃতপক্ষে কৌণিক- ui-utils এর ui-routeনির্দেশিকা ব্যবহার করতে পারেন :

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

বা:

শিরোনাম নিয়ামক

/**
 * Header controller
 */
angular.module('myApp')
  .controller('HeaderCtrl', function ($scope) {
    $scope.menuItems = [
      {
        name: 'Home',
        url:  '/',
        title: 'Go to homepage.'
      },
      {
        name:   'About',
        url:    '/about',
        title:  'Learn about the project.'
      },
      {
        name:   'Contact',
        url:    '/contact',
        title:  'Contact us.'
      }
    ];
  });

সূচক পৃষ্ঠা page

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

আপনি যদি ইউআই-ইউস ব্যবহার করছেন তবে আংশিক / নেস্টেড ভিউগুলি পরিচালনা করার জন্য আপনি ইউআই-রাউটারে আগ্রহীও হতে পারেন ।


ইউআই-রুট পদ্ধতির বিষয়টি অত্যন্ত প্ররোচিত করছে তবে এখনও পর্যন্ত আমি এটিকে ইয়েমেনের কৌণিক জেনারেটর দ্বারা উত্পাদিত প্রকল্পটিতে কাজ করতে পরিচালিত করতে পারি নি।
গাবুজো

@ গাবুজো: আপনি কি বোরারের মাধ্যমে কৌণিক-ইউআই-ইউটিসগুলি ইনস্টল করেছেন?
লজে মেজেস্টে

6

দুঃখিত, দুঃখিত, এই সমস্ত উত্তরগুলি আমার কাছে কিছুটা জটিল হয়ে গেছে। সুতরাং আমি একটি ছোট নির্দেশ তৈরি করেছি যা প্রতি নভবার ভিত্তিতে কাজ করা উচিত:

app.directive('activeLink', function () {
    return {
        link: function (scope, element, attrs) {
            element.find('.nav a').on('click', function () {
                angular.element(this)
                    .parent().siblings('.active')
                    .removeClass('active');
                angular.element(this)
                    .parent()
                    .addClass('active');
            });
        }
    };
});

ব্যবহার:

<ul class="nav navbar-nav navbar-right" active-link>
    <li class="nav active"><a href="home">Home</a></li>
    <li class="nav"><a href="foo">Foo</a></li>
    <li class="nav"><a href="bar">Bar</a></li>
</ul>

আপনি এনএভি বারে কোনও লিঙ্ক ক্লিক করার পরেই আপনার পদ্ধতিটি কাজ করে। আপনি যদি "ফু" একটি ইউআরএল শুরু করেন তবে প্রাথমিকভাবে "হোম" নির্বাচন করা হবে। উদাহরণস্বরূপ লোকালহোস্ট থেকে শুরু করে : 9000 / # / পরিচিতির কারণে এনএভি বারে হোমটি নির্বাচিত প্রদর্শিত হয়।
অ্যাডাম প্লোচার

5

এটি অর্জনের জন্য আমি এনজি-ক্লাসের নির্দেশিকা ব্যবহার করি c

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

এটিতে bar লোকেশন পরিষেবাদিতে অ্যাক্সেস সহ একটি প্রধান নিয়ামকের ভিতরে নববার থাকা দরকার:

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

4

আপনি কৌণিক অভিব্যক্তিতে শর্তসাপেক্ষে এটি অর্জন করতে পারেন, যেমন:

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

এটি বলা হচ্ছে, আমি এটি করার আরও "যথাযথ" উপায় হওয়ার জন্য কৌনিক নির্দেশনা খুঁজে পাই, যদিও এই মিনি-লজিকের অনেকগুলি আউটসোর্সিং আপনার কোড বেসকে কিছুটা দূষিত করতে পারে।

বিকাশের সময় আমি একবারে জিইআইআই স্টাইলিংয়ের জন্য কন্ডিশনাল ব্যবহার করি, কারণ এটি নির্দেশিকা তৈরি করার চেয়ে একটু দ্রুত। আমি আপনাকে একটি উদাহরণ বলতে পারি না যদিও তারা আসলে কোড বেসে দীর্ঘকাল ধরে ছিল। শেষ পর্যন্ত আমি হয় এটি একটি নির্দেশিকায় পরিণত করেছি বা সমস্যা সমাধানের আরও ভাল উপায় খুঁজে পাচ্ছি।


4

আপনি যদি ইউআই-রাউটার ব্যবহার করেন তবে নীচের উদাহরণটিতে কোনও নিয়ামক-পাশের কোডটি যুক্ত না করে গ্রহণযোগ্য উত্তরে @ ড্যানপ্যান্ট্রির মন্তব্যের ভিত্তিতে আপনার চাহিদা পূরণ করতে হবে:

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

এটিতে আরও তথ্যের জন্য আপনি ডক্সটি পরীক্ষা করতে পারেন ।


পারফেক্ট! অবশ্যই সবচেয়ে পরিষ্কার সমাধান
আরেহ বেট্জ

বেশ সহজভাবে সেরা সমাধান চলছে। কে ব্যবহার করে না ui.router!
শিশির

3

যদি আপনি বরং AngularStrap ব্যবহার না করেন তবে এই নির্দেশটি কৌশলটি করা উচিত! এটি https://stackoverflow.com/a/16231859/910764 এর একটি পরিবর্তন ।

জাভাস্ক্রিপ্ট

angular.module('myApp').directive('bsNavbar', ['$location', function ($location) {
  return {
    restrict: 'A',
    link: function postLink(scope, element) {
      scope.$watch(function () {
        return $location.path();
      }, function (path) {
        angular.forEach(element.children(), (function (li) {
          var $li = angular.element(li),
            regex = new RegExp('^' + $li.attr('data-match-route') + '$', 'i'),
            isActive = regex.test(path);
          $li.toggleClass('active', isActive);
        }));
      });
    }
  };
}]);

এইচটিএমএল

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

দ্রষ্টব্য: উপরের এইচটিএমএল ক্লাসগুলি ধরে নিল আপনি বুটস্ট্র্যাপ ৩.x ব্যবহার করছেন


3

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

DIRECTIVE:

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;

        }
    }
 }
});

প্রত্যক্ষ টেম্পলেট (টেমপ্লেট / মেনু 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>

এইচটিএমএল যা প্রত্যক্ষভাবে অন্তর্ভুক্ত

<comp-navbar/>

আশাকরি এটা সাহায্য করবে


1
ফাংশনটি কেবলমাত্র $ সুযোগ.আইএসিটিভ = ফাংশন (ভিউ লোকেশন) to রিটার্ন ভিউ লোকেশন === $ লোকেশন.পাথ () এ সংক্ষিপ্ত করা যেতে পারে; };
ডাব্লুপি ম্যাকনিল

2

মাইল উত্তরটি প্রসারিত করে, এর মতো কাঠামোটি পরিচালনা করতে আমার এটির দরকার ছিল।

-index

-সভেন্টস <-অ্যাকটিভ
--- ইভেন্ট-তালিকা
--- ইভেন্ট-সম্পাদনা
--- ইভেন্ট-ম্যাপ <ক্লিক করুন

-প্লেস
--- স্থান-তালিকা
--- স্থান-সম্পাদনা
--- স্থান-মানচিত্র

সুতরাং ম্যাচের পরিবর্তে, আমাকে শর্তের সাথে মেলে ফর্ম্যাট করা বাচ্চাদের লিঙ্কগুলিকে বৈধতা দেওয়ার জন্য, সূচিপত্র ব্যবহার করতে হয়েছিল। সুতরাং 'ইভেন্ট' এর জন্য:

<li ng-class="{ active: isActive('/event')}" class="divider-vertical dropdown">


function NavController($scope, $location) { 
$scope.isActive = function (viewLocation) {
    var s=false;
    if($location.path().indexOf(viewLocation) != -1){
     s = true;
    }
    return s;
};}

2

এটি একটি সহজ সমাধান

<ul class="nav navbar-nav navbar-right navbar-default menu">
  <li ng-class="menuIndice == 1 ? 'active':''">
    <a ng-click="menuIndice = 1" href="#/item1">item1</a>
  </li>
  <li ng-class="menuIndice == 2 ? 'active':''">
    <a ng-click="menuIndice = 2" href="#/item2">item2</a>
  </li>
  <li ng-class="menuIndice == 3 ? 'active':''">
    <a ng-click="menuIndice = 3" href="#/item3">item3</a>
  </li>
</ul>

1

@ অলিভিয়ের অ্যাঙ্গুলারস্ট্র্যাপ উত্তরের সাথে একত্রে, আমি কেভিনকেলসনের উত্তরটি থেকে এটিকেও বাস্তবায়ন করেছি: https://github.com/twbs/bootstrap/issues/9013

নেটিভলি, বুটস্ট্রা 3 ন্যাভিবারটি কোনও একক পৃষ্ঠার (যেমন অ্যাঙ্গুলার) অ্যাপ্লিকেশনটির জন্য ডিজাইন করা হয়নি এবং এভাবে একটি ছোট পর্দায় ক্লিক করার পরে মেনুটি ধসে পড়ছে না।


1

জাভাস্ক্রিপ্ট

/**
 * Main AngularJS Web Application
 */

var app = angular.module('yourWebApp', [
    'ngRoute'
]);


/**
 * Setup Main Menu
 */

app.controller('MainNavCtrl', [ '$scope', '$location', function ( $scope, $location) {
    $scope.menuItems = [
        {
            name: 'Home',
            url:  '/home',
            title: 'Welcome to our Website'
        },
        {
            name: 'ABOUT',
            url:  '/about',
            title: 'Know about our work culture'
        },
        {
            name:   'CONTACT',
            url:    '/contact',
            title:  'Get in touch with us'
        }
    ];

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

এইচটিএমএল

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

এটি কাজ করে না - এটি বর্তমান ক্লাসটি
ডিওমে

1

পাইলিনাক্সকে ধন্যবাদ । আমি তার কৌশলটি ব্যবহার করেছি এবং এটিকে "ওয়ান" ড্রপ ডাউন মেনু (সাব উল / লি) সমর্থন করার জন্য এটিও পরিবর্তন করেছি, যা আমার প্রয়োজন what এটি নীচের ফিডাল লিঙ্কে কর্মে দেখুন।

পাইলিনাক্সের উত্তরের উপর ভিত্তি করে আপডেট করা ফিডল - http://jsfiddle.net/abhatia/en4qxw6g/

এক স্তরের ড্রপ ডাউন মেনু সমর্থন করার জন্য আমি নিম্নলিখিত তিনটি পরিবর্তন করেছি:
১. লি এর অধীনে "এ" উপাদানটির জন্য ডিডি (ড্রপডাউন) এর একটি শ্রেণীর মান যুক্ত হয়েছে যার সাব উল তালিকা থাকা দরকার।

         <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. নিম্নলিখিত নতুন যুক্তি যুক্ত করতে জাভাস্ক্রিপ্ট আপডেট হয়েছে।

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


৩. সিএসএস আপডেট করে নিম্নলিখিতটি যুক্ত করুন:

a.active {background-color:red;}

আশা করি এটি একক স্তরের ড্রপডাউন মেনুটি বাস্তবায়নের জন্য এমন কাউকে সহায়ক হবে।


1

একটি বস্তুটি স্যুইচ ভেরিয়েবল হিসাবে ব্যবহার করুন।
আপনি এই ইনলাইনটি সহজেই এর সাথে করতে পারেন:

<ul class="nav navbar-nav">
   <li ng-class="{'active':switch.linkOne}" ng-click="switch = {linkOne: true}"><a href="/">Link One</a></li>
   <li ng-class="{'active':switch.linkTwo}" ng-click="switch = {link-two: true}"><a href="/link-two">Link Two</a></li>
</ul>

প্রতিবার আপনি যখন কোনও লিঙ্কে ক্লিক করেন স্যুইচ অবজেক্টটি একটি নতুন অবজেক্ট দ্বারা প্রতিস্থাপন করা হয় যেখানে কেবলমাত্র সঠিক স্যুইচ অবজেক্টের সম্পত্তি সত্য। অপরিজ্ঞাত বৈশিষ্ট্যগুলি ভুয়া হিসাবে মূল্যায়ন করবে এবং সুতরাং যে উপাদানগুলিতে তাদের উপর নির্ভর করে তাদের সক্রিয় শ্রেণি নির্ধারিত হবে না।



0

আমি কোনও লিঙ্কে একটি নির্দেশিকা ব্যবহার করার পরামর্শ দিচ্ছি। এখানে বেহালার হয়।

তবে এটি এখনও নিখুঁত নয়। হ্যাশব্যাংগুলির জন্য নজর রাখুন;)

নির্দেশের জন্য জাভাস্ক্রিপ্ট এখানে:

angular.module('link', []).
  directive('activeLink', ['$location', function(location) {
    return {
      restrict: 'A',
      link: function(scope, element, attrs, controller) {
        var clazz = attrs.activeLink;
        var path = attrs.href;
        path = path.substring(1); //hack because path does not return including hashbang
        scope.location = location;
        scope.$watch('location.path()', function(newPath) {
          if (path === newPath) {
            element.addClass(clazz);
          } else {
            element.removeClass(clazz);
          }
        });
      }
    };
  }]);

এবং এটি এইচটিএমএলে কীভাবে ব্যবহৃত হবে তা এখানে:

<div ng-app="link">
  <a href="#/one" active-link="active">One</a>
  <a href="#/two" active-link="active">One</a>
  <a href="#" active-link="active">home</a>
</div>

এরপরে CSS সহ স্টাইলিং:

.active{ color:red; }

0

বিতর্কটিতে কেবলমাত্র আমার দুটি সেন্ট যুক্ত করার জন্য আমি একটি খাঁটি কৌণিক মডিউল তৈরি করেছি (কোনও জকি নেই), এবং এটি ডেটাযুক্ত হ্যাশ url নিয়েও কাজ করবে। ( ig) #/this/is/path?this=is&some=data )

আপনি কেবল মডিউলটিকে নির্ভরতা হিসাবে এবং auto-activeমেনুর পূর্বপুরুষদের মধ্যে একটিতে যুক্ত করুন। এটার মত:

<ul auto-active>
    <li><a href="#/">main</a></li>
    <li><a href="#/first">first</a></li>
    <li><a href="#/second">second</a></li>
    <li><a href="#/third">third</a></li>
</ul>

এবং মডিউলটি এর মতো দেখতে:

(function () {
    angular.module('autoActive', [])
        .directive('autoActive', ['$location', function ($location) {
        return {
            restrict: 'A',
            scope: false,
            link: function (scope, element) {
                function setActive() {
                    var path = $location.path();
                    if (path) {
                        angular.forEach(element.find('li'), function (li) {
                            var anchor = li.querySelector('a');
                            if (anchor.href.match('#' + path + '(?=\\?|$)')) {
                                angular.element(li).addClass('active');
                            } else {
                                angular.element(li).removeClass('active');
                            }
                        });
                    }
                }

                setActive();

                scope.$on('$locationChangeSuccess', setActive);
            }
        }
    }]);
}());

* (আপনি অবশ্যই কেবল নির্দেশের অংশটি ব্যবহার করতে পারেন)

** এটি খালি হ্যাশগুলির জন্য কাজ করে না ( ig example.com/# বা just example.com) এটি কমপক্ষে example.com/#/বা ন্যায়বিচারের হওয়া দরকার example.com#/। তবে এটি এনজিআরসোর্স এবং এর মতই স্বয়ংক্রিয়ভাবে ঘটে।


এটা ঠিক কদর্য। কৌণিক ব্যবহারের কারণ সরলতার জন্য।
টম স্টিকেল

0

এটি আমার জন্য কৌশলটি করেছে:

  var domain = '{{ DOMAIN }}'; // www.example.com or dev.example.com
  var domain_index =  window.location.href.indexOf(domain);
  var long_app_name = window.location.href.slice(domain_index+domain.length+1); 
  // this turns http://www.example.com/whatever/whatever to whatever/whatever
  app_name = long_app_name.slice(0, long_app_name.indexOf('/')); 
  //now you are left off with just the first whatever which is usually your app name

তারপরে ক্লাস সক্রিয় করতে আপনি jquery (কৌণিকর সাথেও কাজ করে) ব্যবহার করেন

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

এবং অবশ্যই সিএসএস:

.active{background:red;}

যদি আপনার এইচটিএমএল এর মতো থাকে তবে এটি কাজ করে:

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

এটি পৃষ্ঠার ইউআরএলটি ব্যবহার করে অবিচ্ছিন্নভাবে ক্লাস সক্রিয় করবে এবং আপনার www.somesite.com/ee থেইনে যদি অ্যাপটি হয় তবে এটি সক্রিয় থাকবে


0

এটির দীর্ঘ উত্তর দেওয়া হয়েছে তবে আমি ভেবেছিলাম আমি নিজের পথটি ভাগ করব:

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

টেমপ্লেট:

<ul class="nav navbar-nav">
    <li ng-class="{ active: $state.contains('View1') }"><a href="...">View 1</a></li>
    <li ng-class="{ active: $state.contains('View2') }"><a href="...">View 2</a></li>
    <li ng-class="{ active: $state.contains('View3') }"><a href="...">View 3</a></li>
</ul>

যারা ব্যবহার করছেন তাদের জন্য ui-router:

<ul class="nav navbar-nav">
        <li ui-sref-active="active"><a href="...">View 1</a></li>
        <li ui-sref-active="active"><a href="...">View 2</a></li>
        <li ui-sref-active="active"><a href="...">View 3</a></li>
</ul>

সঠিক ম্যাচের জন্য (যেমন নেস্টেড স্টেটস?) ব্যবহার করুন $state.name === 'full/path/to/state'বাui-sref-active-eq="active"


0

আগ্রহী যারা হতে পারে তার জন্য এখানে আরও একটি সমাধান। এর সুবিধা হ'ল এটির নির্ভরতা কম। হেক, এটি একটি ওয়েব সার্ভার ছাড়াও কাজ করে। সুতরাং এটি সম্পূর্ণ ক্লায়েন্ট-সাইড।

এইচটিএমএল:

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

ব্যাখ্যা:

এখানে আমরা নির্দেশিকাটি ব্যবহার করে একটি কৌণিক মডেল থেকে গতিশীল লিঙ্কগুলি উত্পাদন করা হয় ng-repeat। যাদুটি পদ্ধতিগুলির সাথে ঘটে selectTab()এবং getTabClass()নীচে উপস্থাপিত এই নভবারটির জন্য নিয়ামক সংজ্ঞায়িত হয়।

নিয়ন্ত্রক:

angular.module("app.NavigationControllersModule", [])

// Constant named 'activeTab' holding the value 'active'. We will use this to set the class name of the <li> element that is selected.
.constant("activeTab", "active")

.controller("topNavBarCtrl", function($scope, activeTab){
    // Model used for the ng-repeat directive in the template.
    $scope.tabs = ["Page 1", "Page 2", "Page 3"];

    var selectedTab = null;

    // Sets the selectedTab.
    $scope.selectTab = function(newTab){
       selectedTab = newTab;
    };

    // Sets class of the selectedTab to 'active'.
    $scope.getTabClass = function(tab){
       return selectedTab == tab ? activeTab : "";
    };
});

ব্যাখ্যা:

selectTab()ng-clickনির্দেশকে ডাইরেক্টিভ ব্যবহার করে বলা হয় । সুতরাং লিঙ্কটি ক্লিক করা হয়, পরিবর্তনশীলselectedTab এই লিঙ্কটির নামে সেট করা হয়। এইচটিএমএলে আপনি দেখতে পাচ্ছেন যে হোম ট্যাবটির জন্য কোনও যুক্তি ছাড়াই এই পদ্ধতিটি ডাকা হয়েছিল যাতে পৃষ্ঠাটি লোড হওয়ার পরে এটি হাইলাইট হবে।

getTabClass()পদ্ধতির মাধ্যমে বলা হয় ng-classHTML এ নির্দেশ। এই ট্যাবে এটি থাকা ট্যাবটি selectedTabভেরিয়েবলের মানের সমান কিনা তা পরীক্ষা করে । সত্য হিসাবে, এটি "সক্রিয়" অন্যটি "" ফেরত দেয় যা ng-classনির্দেশের মাধ্যমে শ্রেণীর নাম হিসাবে প্রয়োগ করা হয় । তারপরে আপনি যে ক্লাসে সিএসএস activeপ্রয়োগ করেছেন তা নির্বাচিত ট্যাবে প্রয়োগ করা হবে।


কি ঘটবে আমি অন্য কোনও উপায়ে অন্য ট্যাবে নেভিগেট করব?
মিগুয়েল কারভজাল

আপনি কি বোঝাতে চেয়েছেন?
কোভাক

উদাহরণস্বরূপ পৃষ্ঠার একটি লিঙ্ক যা আপনাকে অন্য ট্যাবে নিয়ে যায় যা অন্য ট্যাবে রয়েছে। বোধ হয়?
মিগুয়েল কার্ভাজাল

সেক্ষেত্রে আমি মনে করি উপরের উত্তরে মুলি জুলজারির পরামর্শ অনুসারে ইউআই রাউটার ব্যবহার করা ভাল। ইউআই-রাউটার প্রতিটি ইউআরএলকে একটি রাষ্ট্র নির্ধারণ করে। সুতরাং, কেউ একবার লিঙ্কটিতে ক্লিক করলে ব্যবহারকারীকে সেই লিঙ্কটিতে পাঠানো হবে এবং কৌণিক অ্যাপ্লিকেশনটির অবস্থা আপডেট করা হবে। তারপরে ui-sref = "সক্রিয়" ট্যাবটি হাইলাইট করবে। কৌণিক 2: ui-router.github.io/ng2 এর জন্য এখানে ডকুমেন্টেশন রয়েছে । এছাড়াও, অ্যাঙ্গুলার অ্যাপ্লিকেশনগুলির সাথে ব্যবহারের জন্য করা সাধারণ বুটস্ট্র্যাপ চেহারাটির পরিবর্তে ইউআই বুটস্ট্র্যাপটি দেখুন। ইউআই বুটস্ট্র্যাপ: কৌণিক-ui.github.io/bootstrap
কোভাক

0

কেবল আপনাকে activeপ্রয়োজনীয় রঙের কোড সহ প্রয়োজনীয় ক্লাস যুক্ত করতে হবে ।

উদা: ng-class="{'active': currentNavSelected}" ng-click="setNav"

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