কৌণিক ক্ষেত্রে, আপনি কীভাবে সক্রিয় রুট নির্ধারণ করবেন?


311

দ্রষ্টব্য: এখানে অনেকগুলি ভিন্ন উত্তর রয়েছে এবং বেশিরভাগই এক সময় বা অন্য সময়ে বৈধ হয়েছে। আসল বিষয়টি হ'ল অ্যাঙ্গুলার দলটি তার রাউটার বদলে যা কাজ করেছে তা বহুবার পরিবর্তিত হয়েছে। রাউটার in.০ সংস্করণ যা শেষ পর্যন্ত কৌণিকের রাউটার হবে এটি এর অনেকগুলি সমাধানকে ভেঙে দেয় তবে এর নিজস্ব একটি খুব সাধারণ সমাধান সরবরাহ করে। আরসি.3 হিসাবে, পছন্দসই সমাধানটি এই উত্তরে[routerLinkActive] প্রদর্শিত হিসাবে ব্যবহার করা ।

একটি কৌণিক অ্যাপ্লিকেশনটিতে (আমি এটি লেখার সাথে সাথে ২.০.০-বিটা.0 রিলিজে বর্তমান) বর্তমানে সক্রিয় রুটটি কী তা আপনি কীভাবে নির্ধারণ করবেন?

আমি এমন একটি অ্যাপে কাজ করছি যা বুটস্ট্র্যাপ 4 ব্যবহার করে এবং নেভিগেশন লিঙ্কগুলি / বোতামগুলি সক্রিয় হিসাবে চিহ্নিত করার একটি উপায় প্রয়োজন যখন তাদের সম্পর্কিত উপাদানটি কোনও <router-output>ট্যাগে প্রদর্শিত হচ্ছে ।

আমি বুঝতে পারি যে কোনও একটি বাটন ক্লিক করা হলে আমি নিজেই রাজ্যটি বজায় রাখতে পারি, তবে এটি একই রুটে একাধিক পাথ থাকার ক্ষেত্রে আবশ্যক নয় (মূল নেভিগেশনের পাশাপাশি একটি মূল নেভিগেশন একটি স্থানীয় মেনু বলুন )।

কোন পরামর্শ বা লিঙ্ক প্রশংসা করা হবে। ধন্যবাদ।

উত্তর:


354

নতুন কৌণিক রাউটারের সাহায্যে আপনি [routerLinkActive]="['your-class-name']"আপনার সমস্ত লিঙ্কগুলিতে একটি বৈশিষ্ট্য যুক্ত করতে পারেন :

<a [routerLink]="['/home']" [routerLinkActive]="['is-active']">Home</a>

বা সরলীকৃত অ-অ্যারে বিন্যাস যদি কেবলমাত্র এক শ্রেণির প্রয়োজন হয়:

<a [routerLink]="['/home']" [routerLinkActive]="'is-active'">Home</a>

অথবা একটি আরও সহজ বিন্যাস যদি কেবল একটি শ্রেণীর প্রয়োজন হয়:

<a [routerLink]="['/home']" routerLinkActive="is-active">Home</a>

দেখুন দুর্বল নথিভুক্ত routerLinkActiveনির্দেশ আরও তথ্যের জন্য। (আমি বেশিরভাগ ক্ষেত্রে এটি ট্রায়াল-অ্যান্ড-ত্রুটির মাধ্যমে খুঁজে পেয়েছি))

আপডেট: routerLinkActiveনির্দেশিকার জন্য আরও ভাল ডকুমেন্টেশন এখন এখানে পাওয়া যাবে । (নীচের মন্তব্যে @ ভিক্টর হুগো আরঙ্গো এ-কে ধন্যবাদ জানাই))


4
রুটের শিশুরা যখন সক্রিয় থাকে তখন কী এটি সক্রিয় করার জন্য কোনও উপায় আছে? কোডটিতে @inputবিকল্পগুলির জন্য একটি বিকল্প রয়েছে তবে exact: falseবর্তমান রুটের ভাইবোনরাও যখন সক্রিয় থাকে তখন ক্লাসটি সক্রিয় করে।
মতেজ

1
@ গ্যাব্রিলিবি-ডেভিড আমি এটি পরীক্ষা করে দেখিনি, তবে আমি ধরে নেব যে router.navigate()এটি ঠিক কাজ করবে। routerLinkActiveএই লিঙ্কটি সক্রিয় রুটের প্রতিনিধিত্ব করে কিনা তা কেবল একটি সূচক।
জেসপিনহো

7
প্রদত্ত উদাহরণে, [রাউটারলিঙ্কঅ্যাকটিভ] <a /> ট্যাগে যুক্ত করা হয়েছে, তবে, অন্য কোথাও শ্রেণীর প্রয়োজন হলে এটি অন্যান্য উপাদানগুলিতেও রাখা যেতে পারে। <ul> <li [routerLinkActive] = "[ 'সক্রিয়']"> <a [routerLink]="[myRoute.Route]">
Oblivion2000

2
@ জেসিপিনহো - এটি ব্যবহার করে দেখেছেন - [রাউটারলিঙ্কএকটিভ] = "'সক্রিয়'" কেবল তখনই কাজ করবে যদি আপনার কাছেও এ-ট্যাগে [রাউটারলিঙ্ক] থাকে। আপনার যদি (রাউটারলিংক) পরিবর্তে (ক্লিক করুন) = "নেভিগেটটো ('/ রুট')" থাকত এবং সেই ফাংশনে আপনি এই.আউটটার.নভিগেটকে (রুট) ডাকলেন তবে নতুন উপাদানটি লোড হবে তবে আপনার সক্রিয় সিএসএস শ্রেণি জিতেছে ' টি প্রয়োগ করা হবে। আমি এই ফাংশনটিতে this.router.navigate (..) ছাড়াও অন্য কিছু করার চেষ্টা করছি।
মিকেল কারুসো

2
অফিসিয়াল ডকুমেন্টেশনের উদাহরণটি আপনাকে সহায়তা করতে পারে: কৌণিক.ইও
ভিক্টর হুগো আরঙ্গো এ।

69

আমি অন্য প্রশ্নের জবাব দিয়েছি তবে আমি বিশ্বাস করি এটি সম্ভবত এটির সাথেও প্রাসঙ্গিক হতে পারে। এখানে মূল উত্তরের একটি লিঙ্ক: কৌণিক 2: পরামিতিগুলির সাথে সক্রিয় রুটটি কীভাবে নির্ধারণ করা যায়?

আমি বর্তমান অবস্থানটি (রুটের নাম ব্যবহার করে) ঠিক কী তা জেনেও সক্রিয় শ্রেণি স্থাপনের চেষ্টা করছি । ক্লাসে পাওয়া রৌটএ্যাকটিভ ফাংশনটি ব্যবহার করে এখন পর্যন্ত আমার কাছে পাওয়া সেরা সমাধান ।Router

router.isRouteActive(instruction): Booleanএকটি পরামিতি নেয় যা একটি রুট Instructionঅবজেক্ট এবং প্রত্যাবর্তন হয় trueবা falseনির্দেশটি বর্তমান রুটের জন্য সত্য বা না রাখে। আপনি একটি রুট তৈরি করতে পারেন Instructionব্যবহার করে Routerএর (: এরে linkParams) উৎপন্ন । লিঙ্কপ্যারামগুলি রাউটারলিঙ্কের নির্দেশিকায় (যেমন router.isRouteActive(router.generate(['/User', { user: user.id }]))) কোনও মানকে পাস করার মতো সঠিক বিন্যাসটি অনুসরণ করে ।

এইভাবে রুটকনফিগ দেখতে পেল ( প্যারামগুলির ব্যবহার দেখানোর জন্য আমি এটি কিছুটা টুইট করেছি) :

@RouteConfig([
  { path: '/', component: HomePage, name: 'Home' },
  { path: '/signin', component: SignInPage, name: 'SignIn' },
  { path: '/profile/:username/feed', component: FeedPage, name: 'ProfileFeed' },
])

আর দেখুন ভালো দেখাবে:

<li [class.active]="router.isRouteActive(router.generate(['/Home']))">
   <a [routerLink]="['/Home']">Home</a>
</li>
<li [class.active]="router.isRouteActive(router.generate(['/SignIn']))">
   <a [routerLink]="['/SignIn']">Sign In</a>
</li>
<li [class.active]="router.isRouteActive(router.generate(['/ProfileFeed', { username: user.username }]))">
    <a [routerLink]="['/ProfileFeed', { username: user.username }]">Feed</a>
</li>

এখনও পর্যন্ত সমস্যার জন্য এটি আমার পছন্দের সমাধান হয়ে উঠেছে, এটি আপনার পক্ষেও সহায়ক হতে পারে।


1
আমি মনে করি এই সমাধানটি গ্রহণযোগ্যটির চেয়ে ভাল কারণ এটি পথের সাথে মিলে যাওয়া রেজেেক্সের পরিবর্তে কৌণিক এপিআই ব্যবহার করে। এটি এখনও কিছুটা কুৎসিত হলেও, এটি করতে পেরে ভাল লাগবে router.isRouteActive('Home')
ফিলিপ

2
সমাধানটি বাস্তবায়নের চেষ্টা করার পরে আমি কয়েকটি সমস্যার মুখোমুখি হয়েছিলাম, তাই সম্ভবত কিছুগুলির
নিকিতা ভ্লাসেনকো

5
Routerক্লাসের কনস্ট্রাক্টর স্থাপন করা ভুলে যাওয়া উচিত নয়
নিকিতা ভ্লাসেনকো

2
সর্বশেষতম কৌণিক 2 সংস্করণে আমি রাউটার কনফিগারেশন অবজেক্টের nameপরিবর্তে ব্যবহার করেছি as
কমফ্রিচ

9
এটি পরিবর্তে আরসি 1 এ ব্যবহার করা যেতে পারে:router.urlTree.contains(router.createUrlTree(['Home']))
ফ্রান্স্তিয়াক Žiačik

35

এই লিঙ্কটিতে আমি যে সমস্যার মুখোমুখি হয়েছিলাম তা সমাধান করেছি এবং আমি জানতে পারি যে আপনার প্রশ্নের সহজ সমাধান রয়েছে। আপনি router-link-activeআপনার শৈলীতে পরিবর্তে ব্যবহার করতে পারেন ।

@Component({
   styles: [`.router-link-active { background-color: red; }`]
})
export class NavComponent {
}

2
আমি বিশ্বাস করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। অ্যাঙ্গুলার 2 এর রাউটার এটি আপনার জন্য স্বয়ংক্রিয়ভাবে যোগ করবে।
গাবু

2
দুর্ভাগ্যক্রমে, এই শ্রেণিটি <a> এ যুক্ত হয় <li>
লাইফজেই

দুর্ভাগ্যক্রমে এটি সত্যিই সুন্দরভাবে কাজ করে না। আমার একটি গতিশীলভাবে উত্পন্ন মেনু রয়েছে এবং router-link-activeক্লাসটি সক্রিয় aবা যুক্ত করা হচ্ছে না li। তবে একটি জায়গা আছে যেখানে আমি বুটস্ট্র্যাপ ব্যবহার করছি nav-tabsএবং এটি সেখানে কাজ করে।
শ্রী

33

Https://github.com/angular/angular/pull/6407#issuecomment-190179875 এর উপর ভিত্তি করে @ অ্যালেক্স-কারিয়া-স্যান্টোস উত্তরের ছোট্ট উন্নতি

import {Router, RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router';
// ...
export class App {
  constructor(private router: Router) {
  }

  // ...

  isActive(instruction: any[]): boolean {
    return this.router.isRouteActive(this.router.generate(instruction));
  }
} 

এবং এটি এর মতো ব্যবহার করুন:

<ul class="nav navbar-nav">
    <li [class.active]="isActive(['Home'])">
        <a [routerLink]="['Home']">Home</a>
    </li>
    <li [class.active]="isActive(['About'])">
        <a [routerLink]="['About']">About</a>
    </li>
</ul>

এবং উপাদানের একটি শৈলী styles : [.active {পটভূমি-রঙ: aliceblue; } ]। এটি +1 কাজ করে
প্রতীক কেলওয়ালকার

দুর্দান্ত সমাধান, এটির সাহায্যে আপনি রাউটারটি ব্যক্তিগত করতে পারেন।
কেলভিন ডালকা

এটি একটি আরও ভাল সমাধান এবং বিশেষত এমন একটি নুব-র জন্য দরকারী যারা কন্সট্রাক্টর তৈরি করা এবং রাউটারে পাস করার মতো ছোট জিনিস ভুলে যায়! আপনি পুরোপুরি চেক প্রাপ্য।
মেথোডিশিয়ান

30

আপনি Locationআপনার নিয়ামকটিতে অবজেক্টটি ইনজেকশনের মাধ্যমে এবং বর্তমানের রুটটি পরীক্ষা করে path()দেখতে পারেন:

class MyController {
    constructor(private location:Location) {}

    ...  location.path(); ...
}

আপনাকে প্রথমে এটি আমদানি করতে হবে তা নিশ্চিত করতে হবে:

import {Location} from "angular2/router";

এরপরে আপনি যে রুটটি সক্রিয় তা ফিরে আসার পথে ফিরে যাওয়ার পথে ম্যাচের জন্য আপনি একটি নিয়মিত অভিব্যক্তি ব্যবহার করতে পারেন। নোট করুন যে Locationক্লাসটি LocationStrategyআপনি ব্যবহার করছেন তা বিবেচনা না করেই একটি সাধারণীকরণের পথে ফেরত দেয় । সুতরাং আপনি যদি HashLocationStragegyফিরে আসা পথগুলি ব্যবহার করেন তবে তা এখনও ফর্মের /foo/bar নয় #/foo/bar


17

বর্তমানে সক্রিয় রুটটি কী কীভাবে আপনি নির্ধারণ করবেন?

আপডেট: অ্যাঙ্গুলার 2.4.x অনুযায়ী আপডেট হয়েছে

constructor(route: ActivatedRoute) {
   route.snapshot.params; // active route's params

   route.snapshot.data; // active route's resolved data

   route.snapshot.component; // active route's component

   route.snapshot.queryParams // The query parameters shared by all the routes
}

আরো দেখুন...


14

সক্রিয় রুটগুলি চিহ্নিত routerLinkActiveকরতে ব্যবহার করা যেতে পারে

<a [routerLink]="/user" routerLinkActive="some class list">User</a>

এটি অন্যান্য উপাদানগুলির মতোও কাজ করে

<div routerLinkActive="some class list">
  <a [routerLink]="/user">User</a>
</div>

যদি আংশিক মিল ব্যবহার চিহ্নিত করা উচিত

routerLinkActive="some class list" [routerLinkActiveOptions]="{ exact: false }"

আমি যতদূর জানি exact: falseআরসি ৪. এ ডিফল্ট হতে চলেছে


11

এই মুহুর্তে আমি বুটস্ট্র্যাপ 4 সহ আরসি ৪ ব্যবহার করছি এবং এটি আমার জন্য নিখুঁত কাজ করে:

 <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{exact:
true}">
    <a class="nav-link" [routerLink]="['']">Home</a>
</li>

এটি url: / home এর জন্য কাজ করবে


সঠিক বিকল্পটির উদ্দেশ্য কী? এটি কি এটির মতো সাব-পাথের সাথে মেলে না /home/whatever?
মাইকেল অরিল

হ্যাঁ, exactমানে, সেই রুটের একই নাম থাকবে। আপনি যদি এটি টুইটার বুটস্ট্র্যাপের মতো সরঞ্জামগুলির সাথে ব্যবহার করার পরিকল্পনা করেন তবে এটি প্রয়োজন। এটি ইতিমধ্যে সক্রিয় লিঙ্কের স্থিতি পরিচালনা করে এবং exactবিকল্প ছাড়াই কাজ করবে না। (এটি কীভাবে এটি মূল কাজ করে সে সম্পর্কে নিশ্চিত নন, আমি এটি চেষ্টা করছিলাম এবং এটি আমার জন্য কাজ করছিল)
আর্টেম জিনোভিয়েভ

7

বর্তমান রুটের উপর নির্ভর করে মেনুবার আইটেমগুলিকে স্টাইল করতে রুটডেটা ব্যবহার করার পদ্ধতিটি নীচে রয়েছে:

রাউটকনফাইগে ট্যাব (বর্তমান রুট) সহ ডেটা অন্তর্ভুক্ত রয়েছে:

@RouteConfig([
  {
    path: '/home',    name: 'Home',    component: HomeComponent,
    data: {activeTab: 'home'},  useAsDefault: true
  }, {
    path: '/jobs',    name: 'Jobs',    data: {activeTab: 'jobs'},
    component: JobsComponent
  }
])

এক টুকরো বিন্যাস:

  <li role="presentation" [ngClass]="{active: isActive('home')}">
    <a [routerLink]="['Home']">Home</a>
  </li>
  <li role="presentation" [ngClass]="{active: isActive('jobs')}">
    <a [routerLink]="['Jobs']">Jobs</a>
  </li>

ক্লাস:

export class MainMenuComponent {
  router: Router;

  constructor(data: Router) {
    this.router = data;
  }

  isActive(tab): boolean {
    if (this.router.currentInstruction && this.router.currentInstruction.component.routeData) {
      return tab == this.router.currentInstruction.component.routeData.data['activeTab'];
    }
    return false;
  }
}

7

ভেবেছিলাম আমি এমন একটি উদাহরণ যুক্ত করব যা কোনও ধরণের স্ক্রিপ্ট ব্যবহার করে না:

<input type="hidden" [routerLink]="'home'" routerLinkActive #home="routerLinkActive" />
<section *ngIf="home.isActive"></section>

routerLinkActiveপরিবর্তনশীল একটি টেমপ্লেট পরিবর্তনশীল আবদ্ধ হয় এবং তারপর পুনরায় ব্যবহার প্রয়োজনীয়। দুর্ভাগ্যক্রমে একমাত্র সতর্কতা হ'ল পার্সার হিট করার আগে সমাধান করার দরকার <section>হিসাবে এটি উপাদানগুলিতে আপনার সমস্ত কিছুই থাকতে পারে না ।#home<section>


সক্রিয় রুটে শর্ত প্রয়োগের জন্য নিখুঁত সমাধান @ যেখানে @ কৌনিক / রাউটার বা অন্য কোনও কাজ হয়নি।
রোহিত পার্টে

বাহ, এটি এত সহায়ক। ধন্যবাদ!
ইউুলিয়ান

6

Routerকৌণিক 2 আরসিতে আর সংজ্ঞায়িত করা হয় না isRouteActiveএবং generateপদ্ধতিগুলি।

urlTree - বর্তমান url ট্রি প্রদান করে Return

createUrlTree(commands: any[], segment?: RouteSegment) - বর্তমান url টিতে কমান্ডের একটি অ্যারে প্রয়োগ করে একটি নতুন url ট্রি তৈরি করে tree

অনুসরণ করার চেষ্টা করুন

<li 
[class.active]=
"router.urlTree.contains(router.createUrlTree(['/SignIn', this.routeSegment]))">

নোটিশ, routeSegment : RouteSegmentউপাদান এর কনস্ট্রাক্টর ইনজেক্ট করা আবশ্যক।


6

কৌণিক সংস্করণে সক্রিয় রুট স্টাইলিং যুক্ত করার জন্য এখানে একটি সম্পূর্ণ উদাহরণ রয়েছে 2.0.0-rc.1যা নাল রুট পাথগুলিকে বিবেচনা করে (যেমন path: '/')

app.componal.ts -> রুট

import { Component, OnInit } from '@angular/core';
import { Routes, Router, ROUTER_DIRECTIVES } from '@angular/router';
import { LoginPage, AddCandidatePage } from './export';
import {UserService} from './SERVICES/user.service';

@Component({
  moduleId: 'app/',
  selector: 'my-app',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.css'],
  providers: [UserService],
  directives: [ROUTER_DIRECTIVES]
})

@Routes([
  { path: '/', component: AddCandidatePage },
  { path: 'Login', component: LoginPage }
])
export class AppComponent  { //implements OnInit

  constructor(private router: Router){}

  routeIsActive(routePath: string) {
     let currentRoute = this.router.urlTree.firstChild(this.router.urlTree.root);
     // e.g. 'Login' or null if route is '/'
     let segment = currentRoute == null ? '/' : currentRoute.segment;
     return  segment == routePath;
  }
}

app.component.html

<ul>
  <li [class.active]="routeIsActive('Login')"><a [routerLink]="['Login']" >Login</a></li>
  <li [class.active]="routeIsActive('/')"><a [routerLink]="['/']" >AddCandidate</a></li>
</ul>
<route-outlet></router-outlet>

6

Angular2 আরসি 4 এর সমাধান:

import {containsTree} from '@angular/router/src/url_tree';
import {Router} from '@angular/router';

export function isRouteActive(router: Router, route: string) {
   const currentUrlTree = router.parseUrl(router.url);
   const routeUrlTree = router.createUrlTree([route]);
   return containsTree(currentUrlTree, routeUrlTree, true);
}

5

কৌনিক 8 হিসাবে, এটি কাজ করে:

<li routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }">
    <a [routerLink]="['/']">Home</a>
</li>

{ exact: true } এটি ইউআরএলের সাথে মেলে তা নিশ্চিত করে।


5

2020-এ যদি আপনি এমন কোনও উপাদানের উপর সক্রিয় ক্লাস স্থাপন করতে চান যা [রাউটারলিঙ্ক] নেই - আপনি সহজভাবে করতে পারেন:

<a
  (click)="bookmarks()"
  [class.active]="router.isActive('/string/path/'+you+'/need', false)" // <== you need this one. second argument 'false' - exact: true/false
  routerLinkActive="active"
  [routerLinkActiveOptions]="{ exact: true }"
>
  bookmarks
</a>

ধন্যবাদ, ইগর এটিই সেরা সমাধান।
দিমিত্রি গ্রিঙ্কো

আপনার মতামতের জন্য ধন্যবাদ :)
কুরকভ ইগোর

4

আরেকটি ওয়ার্কারআউন্ড। কৌণিক রাউটার ভি 3 আলফায় অনেক সহজ। রাউটার ইনজেকশন দ্বারা

import {Router} from "@angular/router";

export class AppComponent{

    constructor(private router : Router){}

    routeIsActive(routePath: string) {
        return this.router.url == routePath;
    }
}

ব্যবহার

<div *ngIf="routeIsActive('/')"> My content </div>

আমি এটি আমদানির সাথে সাথেই নাল ত্রুটির একটি সম্পত্তি 'ইসস্কিপস্ফেল্ফ' পড়তে পারি না। কোন ধারনা?
অতীশুব

4

Angular2 RC2 এ আপনি এই সাধারণ বাস্তবায়নটি ব্যবহার করতে পারেন

<a [routerLink]="['/dashboard']" routerLinkActive="active">Dashboard</a>

এটি activeম্যাচ করা url সহ উপাদানগুলিতে ক্লাস যুক্ত করবে , এ সম্পর্কে এখানে আরও পড়ুন


4

আজ অবধি প্রকাশিত কৌনিক 2 আরসি সংস্করণের সমস্ত সংস্করণগুলির জন্য এই প্রশ্নের উত্তর নীচে দেওয়া হয়েছে:

আরসি 4 এবং আরসি 3 :

লিঙ্কের পূর্বসূরী বা পূর্বপুরুষের ক্লাস প্রয়োগের জন্য:

<li routerLinkActive="active"><a [routerLink]="['/home']">Home</a></li>

/ বাড়ির ইউআরএল হওয়া উচিত এবং রুটের নাম নয়, কারণ রাউটার ভি 3 হিসাবে নামের সম্পত্তি আর রুট অবজেক্টে বিদ্যমান নেই।

এই লিঙ্কে রাউটারলিঙ্কঅ্যাকটিভ দিকনির্দেশনা সম্পর্কে আরও ।

বর্তমান রুটের ভিত্তিতে যে কোনও ডিভিতে ক্লাস প্রয়োগের জন্য:

  • উপাদানটির কনস্ট্রাক্টরে রাউটার ইনজেকশন করুন।
  • তুলনার জন্য ব্যবহারকারী রাউটার.আরএল।

যেমন

<nav [class.transparent]="router.url==('/home')">
</nav>

আরসি 2 এবং আরসি 1 :

রাউটার.আইআরউটিএকটিভ এবং ক্লাসের সমন্বয় ব্যবহার করুন * * যেমন হোম রুটের উপর ভিত্তি করে সক্রিয় শ্রেণি প্রয়োগ করা।

নাম এবং ইউআরএল উভয়ই রাউটার.জেনারেটে পাস করা যেতে পারে।

 <li [class.active]="router.isRouteActive(router.generate(['Home']))">
    <a [routerLink]="['Home']" >Home</a>
</li>

4

routerLinkActiveকোনও লিঙ্ক থাকে এবং আপনি কিছু ক্লাস প্রয়োগ করতে চান যখন সহজ ক্ষেত্রে ব্যবহার করা ভাল। তবে আরও জটিল ক্ষেত্রে যেখানে আপনার রাউটার লিঙ্ক নাও থাকতে পারে বা যেখানে আপনার আরও কিছু প্রয়োজন সেখানে আপনি পাইপ তৈরি এবং ব্যবহার করতে পারেন :

@Pipe({
    name: "isRouteActive",
    pure: false
})
export class IsRouteActivePipe implements PipeTransform {

    constructor(private router: Router,
                private activatedRoute: ActivatedRoute) {
    }

    transform(route: any[], options?: { queryParams?: any[], fragment?: any, exact?: boolean }) {
        if (!options) options = {};
        if (options.exact === undefined) options.exact = true;

        const currentUrlTree = this.router.parseUrl(this.router.url);
        const urlTree = this.router.createUrlTree(route, {
            relativeTo: this.activatedRoute,
            queryParams: options.queryParams,
            fragment: options.fragment
        });
        return containsTree(currentUrlTree, urlTree, options.exact);
    }
}

তারপর:

<div *ngIf="['/some-route'] | isRouteActive">...</div>

এবং পাইপ নির্ভরতা মধ্যে পাইপ অন্তর্ভুক্ত ভুলবেন না;)


ভাল ধারণা তবে কৌণিক 2.0.0rc3 এ আমি this.router.isRouteActive ... এ বদলেছি l_লোকেশন.পথ () এবং উপরে রাখি: '@ কৌনিক / সাধারণ' থেকে {অবস্থান import আমদানি করুন;
কামিল কিয়েসজেউস্কি

2
কোড থেকে কিছু অনুপস্থিত বলে মনে হচ্ছে। containsTreeসংজ্ঞায়িত কোথায় ?
ইস্টিন আমন্ডসেন

4

কৌণিক সংস্করণ 4+ এর জন্য আপনার কোনও জটিল সমাধান ব্যবহার করার দরকার নেই। আপনি সহজভাবে ব্যবহার করতে পারেন [routerLinkActive]="'is-active'"

বুটস্ট্র্যাপ 4 ন্যাভ লিঙ্ক সহ উদাহরণের জন্য:

    <ul class="navbar-nav mr-auto">
      <li class="nav-item" routerLinkActive="active">
        <a class="nav-link" routerLink="/home">Home</a>
      </li>
      <li class="nav-item" routerLinkActive="active">
        <a class="nav-link" routerLink="/about-us">About Us</a>
      </li>
      <li class="nav-item" routerLinkActive="active">
        <a class="nav-link " routerLink="/contact-us">Contact</a>
      </li>
    </ul>

3

রাউটার বর্গের একটি উদাহরণ প্রকৃতপক্ষে একটি পর্যবেক্ষণযোগ্য এবং এটি প্রতি পরিবর্তিত পরিবর্তিত বর্তমান পথটি ফিরিয়ে দেয়। আমি এটি এইভাবে করি:

export class AppComponent implements OnInit { 

currentUrl : string;

constructor(private _router : Router){
    this.currentUrl = ''
}

ngOnInit() {
    this._router.subscribe(
        currentUrl => this.currentUrl = currentUrl,
        error => console.log(error)
    );
}

isCurrentRoute(route : string) : boolean {
    return this.currentUrl === route;
 } 
}

এবং তারপরে আমার এইচটিএমএলে:

<a [routerLink]="['Contact']" class="item" [class.active]="isCurrentRoute('contact')">Contact</a>

1
। রাউটার উদাহরণগুলিতে সাবস্ক্রাইব উপলভ্য নয়।
শিবাং গুপ্ত

3

গৃহীত উত্তরের একটি মন্তব্যে উল্লিখিত হিসাবে, routerLinkActiveনির্দেশটি প্রকৃত <a>ট্যাগের ধারকটিতেও প্রয়োগ করা যেতে পারে ।

সুতরাং উদাহরণস্বরূপ টুইটার বুটস্ট্র্যাপ ট্যাবগুলির সাথে যেখানে সক্রিয় ক্লাসটি সেই <li>লিগে থাকা ট্যাগটিতে প্রয়োগ করা উচিত :

<ul class="nav nav-tabs">
    <li role="presentation" routerLinkActive="active">
        <a routerLink="./location">Location</a>
    </li>
    <li role="presentation" routerLinkActive="active">
        <a routerLink="./execution">Execution</a>
    </li>
</ul>

বেশ ঝরঝরে ! আমি মনে করি যে নির্দেশিকাটি ট্যাগের সামগ্রীটি পরীক্ষা করে এবং নির্দেশের <a>সাথে একটি ট্যাগ সন্ধান করে routerLink


2

কৌণিক 5 ব্যবহারকারীদের জন্য সহজ সমাধানটি হল, কেবলমাত্র routerLinkActiveতালিকার আইটেমটি যুক্ত করুন।

একটি routerLinkActiveনির্দেশিকা একটি routerLinkনির্দেশের মাধ্যমে একটি রুটের সাথে যুক্ত ।

এটি ইনপুট হিসাবে ক্লাসগুলির একটি অ্যারে নেয় যা এটির সাথে যুক্ত হওয়া উপাদানগুলিতে যোগ করবে যখন এটির রুটটি বর্তমানে সক্রিয় রয়েছে, যেমন:

<li class="nav-item"
    [routerLinkActive]="['active']">
  <a class="nav-link"
     [routerLink]="['home']">Home
  </a>
</li>

আমরা বর্তমানে হোম রুটটি যদি দেখছি তবে উপরেরগুলি অ্যাঙ্কর ট্যাগটিতে সক্রিয় একটি শ্রেণি যুক্ত করবে।

ডেমো


2

এবং কৌণিকের সর্বশেষতম সংস্করণে, আপনি কেবল চেক করতে পারেন router.isActive(routeNameAsString)। উদাহরণস্বরূপ নীচের উদাহরণটি দেখুন:

 <div class="collapse navbar-collapse" id="navbarNav">
    <ul class="navbar-nav">
      <li class="nav-item" [class.active] = "router.isActive('/dashboard')">
        <a class="nav-link" href="#">داشبورد <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item" [class.active] = "router.isActive(route.path)" *ngFor="let route of (routes$ | async)">
        <a class="nav-link" href="javascript:void(0)" *ngIf="route.childRoutes && route.childRoutes.length > 0"
          [matMenuTriggerFor]="menu">{{route.name}}</a>
        <a class="nav-link" href="{{route.path}}"
          *ngIf="!route.childRoutes || route.childRoutes.length === 0">{{route.name}}</a>
        <mat-menu #menu="matMenu">
          <span *ngIf="route.childRoutes && route.childRoutes.length > 0">
            <a *ngFor="let child of route.childRoutes" class="nav-link" href="{{route.path + child.path}}"
              mat-menu-item>{{child.name}}</a>
          </span>
        </mat-menu>
      </li>
    </ul>
    <span class="navbar-text mr-auto">
      <small>سلام</small> {{ (currentUser$ | async) ? (currentUser$ | async).firstName : 'کاربر' }}
      {{ (currentUser$ | async) ? (currentUser$ | async).lastName : 'میهمان' }}
    </span>
  </div>

এবং নিশ্চিত করুন যে আপনি নিজের উপাদানটিতে ইঞ্জেকশন রাউটারটি ভুলে যাচ্ছেন না।


1

আমি অ্যাঙ্গুলার 2 এর সাথে একটি টুইটার বুটস্ট্র্যাপ স্টাইল এনএভি ব্যবহার করার উপায় খুঁজছিলাম, তবে এটি পেতে সমস্যা হয়েছিল active নির্বাচিত লিঙ্কটির মূল উপাদানটিতে ক্লাস প্রয়োগ করতে । পাওয়া গেছে যে @ অ্যালেক্স-কারিয়া-স্যান্টোসের সমাধান পুরোপুরি কার্যকর!

আপনার ট্যাবযুক্ত উপাদানটি আপনাকে প্রয়োজনীয় কল করার আগে রাউটারটি আমদানি করতে হবে এবং নির্মাতায় এটি নির্ধারণ করতে হবে।

আমার বাস্তবায়নের একটি সরল সংস্করণ এখানে ...

import {Component} from 'angular2/core';
import {Router, RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router';
import {HomeComponent} from './home.component';
import {LoginComponent} from './login.component';
import {FeedComponent} from './feed.component';

@Component({
  selector: 'my-app',
  template: `
    <ul class="nav nav-tabs">
      <li [class.active]="_r.isRouteActive(_r.generate(['Home']))">
        <a [routerLink]="['Home']">Home</a>
      </li>
      <li [class.active]="_r.isRouteActive(_r.generate(['Login']))">
        <a [routerLink]="['Login']">Sign In</a>
      </li>
      <li [class.active]="_r.isRouteActive(_r.generate(['Feed']))">
        <a [routerLink]="['Feed']">Feed</a>
      </li>
    </ul>`,
  styleUrls: ['app/app.component.css'],
  directives: [ROUTER_DIRECTIVES]
})
@RouteConfig([
  { path:'/', component:HomeComponent, name:'Home', useAsDefault:true },
  { path:'/login', component:LoginComponent, name:'Login' },
  { path:'/feed', component:FeedComponent, name:'Feed' }
])
export class AppComponent {
  title = 'My App';
  constructor( private _r:Router ){}
}

1

যাক আপনি আমার সক্রিয় রাষ্ট্র / ট্যাবে সিএসএস যুক্ত করতে চান। আপনার রাউটিং লিঙ্কটি সক্রিয় করতে রাউটারলিঙ্কঅ্যাকটিভ ব্যবহার করুন।

দ্রষ্টব্য: 'সক্রিয়' এখানে আমার শ্রেণীর নাম

<style>
   .active{
       color:blue;
     }
</style>

  <a routerLink="/home" [routerLinkActive]="['active']">Home</a>
  <a routerLink="/about" [routerLinkActive]="['active']">About</a>
  <a routerLink="/contact" [routerLinkActive]="['active']">Contact</a>

0

আমি কৌনিক রাউটার ব্যবহার করছি ^3.4.7এবং আমার এখনও routerLinkActiveনির্দেশের সাথে সমস্যা হচ্ছে ।

একই url এর সাথে যদি আপনার একাধিক লিঙ্ক থাকে তবে এটি কাজ করে না এটি সর্বদা রিফ্রেশ বলে মনে হয় না।

@ টমাসব্বক উত্তর দ্বারা অনুপ্রাণিত হয়ে আমি কাজটি করার জন্য একটি সামান্য উপাদান তৈরি করেছি


0

খাঁটি এইচটিএমএল টেমপ্লেট এর মতো হতে হবে

 <a [routerLink]="['/home']" routerLinkActive="active">Home</a>
 <a [routerLink]="['/about']" routerLinkActive="active">About us</a>
 <a [routerLink]="['/contact']" routerLinkActive="active">Contacts</a>

0

আপনার .ts এ রাউটারলিঙ্কএকটিভ আমদানি করে শুরু করুন

'@ কৌণিক / রাউটার' থেকে {রাউটারলিঙ্কএকটিভ import আমদানি করুন;

এখন আপনার এইচটিএমএলে রাউটারলিঙ্কএকটিভ ব্যবহার করুন

<span class="" routerLink ="/some_path" routerLinkActive="class_Name">Value</span></a>

"class_Name" ক্লাসে কিছু সিএসএস সরবরাহ করুন, যেমন এই লিঙ্কটি সক্রিয় / ক্লিক করা হবে আপনি পরিদর্শন করার সময় এই ক্লাসটি স্প্যানটিতে দেখতে পাবেন।


0

একটি প্রোগ্রামক্রমেটিক উপায় হ'ল এটি উপাদানটিতেই করা। আমি এই ইস্যুতে তিন সপ্তাহ সংগ্রাম করেছি, তবে কৌণিক ডক্স ছেড়ে দিয়েছি এবং রাউটারলিঙ্ক্যাকটিভ কাজ এবং প্রকৃত কোডগুলি খুঁজে পেতে পারি তার সম্পর্কে প্রকৃত কোডটি পড়েছি।

    import {
  Component,AfterContentInit,OnDestroy, ViewChild,OnInit, ViewChildren, AfterViewInit, ElementRef, Renderer2, QueryList,NgZone,ApplicationRef
}
  from '@angular/core';
  import { Location } from '@angular/common';

import { Subscription } from 'rxjs';
import {
  ActivatedRoute,ResolveStart,Event, Router,RouterEvent, NavigationEnd, UrlSegment
} from '@angular/router';
import { Observable } from "rxjs";
import * as $ from 'jquery';
import { pairwise, map } from 'rxjs/operators';
import { filter } from 'rxjs/operators';
import {PageHandleService} from '../pageHandling.service'
@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.scss']
})




export class HeaderComponent implements AfterContentInit,AfterViewInit,OnInit,OnDestroy{

    public previousUrl: any;
    private subscription: Subscription;


      @ViewChild("superclass", { static: false } as any) superclass: ElementRef;
      @ViewChildren("megaclass") megaclass: QueryList<ElementRef>;


  constructor( private element: ElementRef, private renderer: Renderer2, private router: Router, private activatedRoute: ActivatedRoute, private location: Location, private pageHandleService: PageHandleService){
    this.subscription = router.events.subscribe((s: Event) => {
      if (s instanceof NavigationEnd) {
        this.update();
      }
    });


  }


  ngOnInit(){

  }


  ngAfterViewInit() {
  }

  ngAfterContentInit(){
  }



private update(): void {
  if (!this.router.navigated || !this.superclass) return;
      Promise.resolve().then(() => {
        this.previousUrl = this.router.url

        this.megaclass.toArray().forEach( (superclass) => {

          var superclass = superclass
          console.log( superclass.nativeElement.children[0].classList )
          console.log( superclass.nativeElement.children )

          if (this.previousUrl == superclass.nativeElement.getAttribute("routerLink")) {
            this.renderer.addClass(superclass.nativeElement.children[0], "box")
            console.log("add class")

          } else {
            this.renderer.removeClass(superclass.nativeElement.children[0], "box")
            console.log("remove class")
          }

        });
})
//update is done
}
ngOnDestroy(): void { this.subscription.unsubscribe(); }


//class is done
}

দ্রষ্টব্য :
প্রোগ্র্যাম্যাটিক উপায়ে রাউটার-লিঙ্কটি যুক্ত করার বিষয়টি নিশ্চিত করুন এবং এতে একটি শিশু উপাদান লাগে। আপনি যদি এটি পরিবর্তন করতে চান তবে আপনার বাচ্চাদের এড়ানো উচিত superclass.nativeElement

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