Trong Angular, làm thế nào để bạn xác định tuyến đường hoạt động?


312

LƯU Ý: Có nhiều câu trả lời khác nhau ở đây và hầu hết đều có giá trị lúc này hay lúc khác. Thực tế là những gì hoạt động đã thay đổi nhiều lần khi nhóm Angular đã thay đổi Bộ định tuyến. Phiên bản Router 3.0 mà cuối cùng sẽ là các bộ định tuyến trong phá vỡ góc rất nhiều các giải pháp, nhưng cung cấp một giải pháp rất đơn giản của riêng nó. Kể từ RC.3, giải pháp ưa thích là sử dụng [routerLinkActive]như trong câu trả lời này .

Trong một ứng dụng Angular (hiện tại trong bản phát hành 2.0.0-beta.0 khi tôi viết bài này), làm thế nào để bạn xác định tuyến đường hiện đang hoạt động là gì?

Tôi đang làm việc trên một ứng dụng sử dụng Bootstrap 4 và tôi cần một cách để đánh dấu các liên kết / nút điều hướng là hoạt động khi thành phần liên quan của chúng được hiển thị trong <router-output>thẻ.

Tôi nhận ra rằng tôi có thể tự duy trì trạng thái khi nhấp vào một trong các nút, nhưng điều đó sẽ không bao gồm trường hợp có nhiều đường dẫn vào cùng một tuyến đường (giả sử menu điều hướng chính cũng như menu cục bộ trong thành phần chính ).

Bất kỳ đề xuất hoặc liên kết sẽ được đánh giá cao. Cảm ơn.

Câu trả lời:


356

Với bộ định tuyến Angular mới , bạn có thể thêm một [routerLinkActive]="['your-class-name']"thuộc tính cho tất cả các liên kết của mình:

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

Hoặc định dạng phi mảng đơn giản hóa nếu chỉ cần một lớp:

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

Hoặc một định dạng thậm chí đơn giản hơn nếu chỉ cần một lớp:

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

Xem chỉ thị tài liệu kémrouterLinkActive để biết thêm. (Tôi chủ yếu tìm ra điều này thông qua thử và sai.)

CẬP NHẬT: Tài liệu tốt hơn cho routerLinkActivechỉ thị bây giờ có thể được tìm thấy ở đây . (Cảm ơn @Victor Hugo Arango A. trong các bình luận bên dưới.)


4
Có cách nào để nó kích hoạt khi trẻ em của tuyến đang hoạt động không? Mã này có một @inputtùy chọn, nhưng exact: falsekích hoạt lớp bất cứ khi nào anh chị em của tuyến hiện tại cũng hoạt động.
Matej

1
@ GabrieleB-David Tôi chưa thử nó, nhưng tôi cho rằng nó router.navigate()sẽ hoạt động tốt. routerLinkActivechỉ đơn giản là một chỉ báo cho dù liên kết này đại diện cho tuyến đường hoạt động.
jreetpinho

7
Trong ví dụ đã cho, [routerLinkActive] được thêm vào thẻ <a />, tuy nhiên, nó cũng có thể được đặt trên các phần tử khác nếu lớp được yêu cầu ở nơi khác. <ul> <li [routerLinkActive] = "['active']"> <a [routerLink[="[myRoute.Route[">
Oblivion2000

2
@jessepinho - Đã thử nó - [routerLinkActive] = "'active'" sẽ chỉ hoạt động nếu bạn cũng có [routerLink] trong thẻ a. Nếu bạn đã có (click) = "navitageTo ('/ route')" thay vì [routerLink] và trong chức năng đó, bạn đã gọi this.router.navigate (tuyến đường), thành phần mới sẽ tải nhưng lớp CSS hoạt động của bạn đã thắng ' t được áp dụng. Tôi đang cố gắng làm một cái gì đó khác trong chức năng đó ngoài this.router.navigate (..).
Mickael Caruso

2
Ví dụ trong tài liệu chính thức có thể giúp bạn: angular.io/docs/ts/latest/api/router/index/ Kẻ
Victor Hugo Arango A.

69

Tôi đã trả lời điều này trong một câu hỏi khác nhưng tôi tin rằng nó cũng có thể liên quan đến câu hỏi này. Đây là một liên kết đến câu trả lời ban đầu: Angular 2: Làm thế nào để xác định tuyến đường hoạt động với các tham số?

Tôi đã cố gắng thiết lập lớp hoạt động mà không cần phải biết chính xác vị trí hiện tại (sử dụng tên tuyến đường) . Giải pháp tốt nhất mà tôi có được cho đến nay là sử dụng hàm isRouteActive có sẵn trong Routerlớp.

router.isRouteActive(instruction): Booleannhận một tham số là một Instructionđối tượng tuyến và trả về truehoặc falseliệu lệnh đó có đúng hay không cho tuyến hiện tại. Bạn có thể tạo ra một con đường Instructionbằng cách sử dụng Router's tạo (linkParams: Array) . LinkParams theo định dạng chính xác giống như một giá trị truyền vào một routerLink chỉ thị (ví dụ router.isRouteActive(router.generate(['/User', { user: user.id }]))).

Đây là cách mà RouteConfig có thể trông như thế nào (Tôi đã điều chỉnh nó một chút để hiển thị việc sử dụng params) :

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

Chế độ xem sẽ như thế này:

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

Đây là giải pháp ưa thích của tôi cho vấn đề cho đến nay, nó cũng có thể hữu ích cho bạn.


1
Tôi nghĩ giải pháp này tốt hơn giải pháp được chấp nhận vì nó sử dụng API của Angular thay vì regex khớp với đường dẫn. Nó vẫn còn một chút xấu xí, mặc dù nó có thể làm được router.isRouteActive('Home').
Philip

2
Tôi đã gặp phải một số vấn đề khi cố gắng thực hiện giải pháp, vì vậy có lẽ đối với một số vấn đề có thể hữu ích: stackoverflow.com/questions353882998/ợi
Nikita Vlasenko

5
không nên quên đưa Routervào nhà xây dựng của lớp
Nikita Vlasenko

2
Trong phiên bản Angular 2 mới nhất tôi đã sử dụng namethay vì astrong đối tượng cấu hình bộ định tuyến.
ComFalet

9
Điều này có thể được sử dụng trong RC1 thay thế:router.urlTree.contains(router.createUrlTree(['Home']))
František iačik

35

Tôi đã giải quyết một vấn đề tôi gặp phải trong liên kết này và tôi phát hiện ra rằng có một giải pháp đơn giản cho câu hỏi của bạn. Bạn có thể sử dụng router-link-activethay thế trong phong cách của bạn.

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

2
Tôi tin rằng đây nên là câu trả lời được chấp nhận. Bộ định tuyến của Angular2 sẽ tự động thêm nó cho bạn.
Gabu

2
thật không may, lớp đó thêm vào <a>, không phải trên <li>
laifjei

Thật không may, nó không thực sự hoạt động tốt. tôi có một menu được tạo động và router-link-activelớp không được thêm vào hoạt động ahoặc li. nhưng có một nơi tôi đang sử dụng bootstrap nav-tabsvà nó hoạt động ở đó.
Shri

33

Cải thiện nhỏ cho câu trả lời @ alex-correia-santos dựa trên 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));
  }
} 

Và sử dụng nó như thế này:

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

và một kiểu trong thành phần styles : [.active {background-color: aliceblue; } ]. +1 nó hoạt động
Pratik Kelwalkar

Giải pháp tuyệt vời, với điều này bạn có thể làm cho bộ định tuyến riêng tư.
Kelvin Dealca

Đây là một giải pháp tốt hơn nhiều và đặc biệt hữu ích cho một người mới quên những điều nhỏ nhặt như tạo hàm tạo và chuyển qua bộ định tuyến! Bạn hoàn toàn xứng đáng được kiểm tra.
phương pháp

30

Bạn có thể kiểm tra tuyến đường hiện tại bằng cách đưa Locationđối tượng vào bộ điều khiển của mình và kiểm tra path(), như vậy:

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

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

Bạn sẽ phải đảm bảo nhập nó trước:

import {Location} from "angular2/router";

Sau đó, bạn có thể sử dụng biểu thức chính quy để khớp với đường dẫn được trả về để xem tuyến nào đang hoạt động. Lưu ý rằng Locationlớp trả về một đường dẫn chuẩn hóa bất kể LocationStrategybạn đang sử dụng loại nào. Vì vậy, ngay cả khi bạn đang sử dụng HashLocationStragegycác đường dẫn quay trở lại vẫn sẽ có dạng /foo/bar không #/foo/bar


17

Làm thế nào để bạn xác định tuyến đường hiện đang hoạt động là gì?

CẬP NHẬT: được cập nhật theo Angular2.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
}

xem thêm ...


14

Để đánh dấu các tuyến đang hoạt động routerLinkActivecó thể được sử dụng

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

Điều này cũng hoạt động trên các yếu tố khác như

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

Nếu phù hợp một phần cũng nên được đánh dấu sử dụng

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

Theo như tôi biết exact: falsesẽ là mặc định trong RC.4


11

Hiện tại tôi đang sử dụng RC.4 với bootstrap 4 và cái này hoạt động hoàn hảo với tôi:

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

Điều này sẽ làm việc cho url: / home


Mục đích của lựa chọn chính xác là gì? Điều đó làm cho nó không phù hợp với đường dẫn phụ như thế /home/whatevernào?
Michael Oryl

vâng, exactcó nghĩa là, tuyến đường đó sẽ có cùng tên. Và điều này là bắt buộc nếu bạn có kế hoạch sử dụng nó với các công cụ như twitter bootstrap. Nó đã xử lý trạng thái liên kết hoạt động và không có exacttùy chọn sẽ không hoạt động. (không chắc về cách thức hoạt động của lõi, tôi đã thử và nó hoạt động với tôi)
Artem Zinoviev

7

Dưới đây là phương pháp sử dụng RouteData để tạo kiểu cho các mụcBar tùy thuộc vào tuyến đường hiện tại:

RouteConfig bao gồm dữ liệu với tab (tuyến hiện tại):

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

Một phần của bố cục:

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

Lớp học:

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

Chỉ cần nghĩ rằng tôi sẽ thêm vào một ví dụ không sử dụng bất kỳ bản thảo nào:

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

Các routerLinkActivebiến được ràng buộc với một mẫu biến và sau đó tái sử dụng theo yêu cầu. Thật không may, lời cảnh báo duy nhất là bạn không thể có tất cả điều này trên <section>phần tử vì #homecần phải giải quyết trước khi trình phân tích cú pháp nhấn <section>.


Giải pháp hoàn hảo để áp dụng các điều kiện trên các tuyến đang hoạt động. Trường hợp @ angular / bộ định tuyến hoặc cách khác không hoạt động.
Rohit Parte

Wow, điều này rất hữu ích. Cảm ơn!
Yulian

6

Routertrong Angular 2 RC không còn định nghĩa isRouteActivegeneratephương thức.

urlTree - Trả về cây url hiện tại.

createUrlTree(commands: any[], segment?: RouteSegment) - Áp dụng một mảng các lệnh cho cây url hiện tại và tạo một cây url mới.

Hãy thử làm theo

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

thông báo, routeSegment : RouteSegmentphải được đưa vào hàm tạo của thành phần.


6

Đây là một ví dụ hoàn chỉnh để thêm kiểu tuyến đường hoạt động trong phiên bản Angular 2.0.0-rc.1có tính đến các đường dẫn gốc null (ví dụ path: '/')

app.component.ts -> Tuyến đường

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

Giải pháp cho Angular2 RC 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

Kể từ Angular 8, điều này hoạt động:

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

{ exact: true } đảm bảo nó phù hợp với url.


5

vào năm 2020 nếu bạn muốn đặt lớp hoạt động trên thành phần không có [routerLink] - bạn có thể thực hiện đơn giản:

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

Cảm ơn, Igor. Đây là giải pháp tốt nhất.
Dmitry Grinko

Cảm ơn phản hồi của bạn :)
Kurkov Igor

4

Một cách giải quyết khác. Dễ dàng hơn nhiều trong Angular Router V3 Alpha. bằng cách tiêm Router

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

export class AppComponent{

    constructor(private router : Router){}

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

sử dụng

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

ngay khi tôi nhập nó, tôi nhận được một thuộc tính không thể đọc 'isSkipSelf' của lỗi null. có ý kiến ​​gì không
atsituab

4

Trong Angular2 RC2, bạn có thể sử dụng triển khai đơn giản này

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

điều này sẽ thêm lớp activevào thành phần có url phù hợp, đọc thêm về nó ở đây


4

Dưới đây là câu trả lời cho câu hỏi này cho tất cả các phiên bản Angular 2 RC được phát hành cho đến nay:

RC4 và RC3 :

Đối với lớp áp dụng để liên kết hoặc tổ tiên của liên kết:

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

/ home phải là URL và không phải là tên của tuyến vì thuộc tính tên không còn tồn tại trên Object Object kể từ Bộ định tuyến v3.

Thông tin thêm về bộ định tuyến RouterLinkActive tại liên kết này .

Để áp dụng lớp cho bất kỳ div dựa trên tuyến đường hiện tại:

  • Tiêm Router vào constructor của thành phần.
  • Người dùng router.url để so sánh.

ví dụ

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

RC2 và RC1 :

Sử dụng kết hợp bộ định tuyến.isRouteActive và lớp. *. ví dụ: để áp dụng lớp học tích cực dựa trên Home Route.

Tên và url đều có thể được chuyển vào router.generate.

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

4

Sử dụng routerLinkActivelà tốt trong các trường hợp đơn giản, khi có một liên kết và bạn muốn áp dụng một số lớp. Nhưng trong những trường hợp phức tạp hơn, trong đó bạn có thể không có bộ định tuyếnLink hoặc nơi bạn cần thứ gì đó nhiều hơn bạn có thể tạo và sử dụng một đường ống :

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

sau đó:

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

và đừng quên bao gồm đường ống trong các phụ thuộc đường ống;)


Ý tưởng hay nhưng trong angular2.0.0rc3 tôi thay đổi this.router.isRouteActive ... thành this._location.path () và đặt lên trên này: nhập {Location} từ '@ angular / common';
Kamil Kiełczewski

2
Dường như thiếu một cái gì đó từ mã. Trường hợp được containsTreexác định?
Øystein Amundsen

4

Đối với phiên bản Angular 4+, bạn không cần sử dụng bất kỳ giải pháp phức tạp nào. Bạn chỉ có thể sử dụng [routerLinkActive]="'is-active'".

Ví dụ với liên kết điều hướng bootstrap 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

Một thể hiện của lớp Router thực sự là một Observable và nó trả về đường dẫn hiện tại mỗi khi nó thay đổi. Đây là cách tôi làm điều đó:

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

Và sau đó trong HTML của tôi:

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

1
.subscribe không có sẵn trên bộ định tuyến.
Shivang Gupta

3

Như đã đề cập trong một trong những ý kiến ​​của câu trả lời được chấp nhận, lệnh routerLinkActivenày cũng có thể được áp dụng cho một thùng chứa <a>thẻ thực tế .

Vì vậy, ví dụ với các tab Twitter Bootstrap nơi lớp hoạt động sẽ được áp dụng cho <li>thẻ có chứa liên kết:

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

Khá gọn gàng! Tôi cho rằng chỉ thị kiểm tra nội dung của thẻ và tìm kiếm một <a>thẻ với routerLinkchỉ thị.


2

Giải pháp đơn giản cho 5 người dùng góc cạnh là, chỉ cần thêm routerLinkActivevào mục danh sách.

Một routerLinkActivechỉ thị được liên kết với một tuyến đường thông qua một routerLinkchỉ thị.

Nó nhận đầu vào là một mảng các lớp mà nó sẽ thêm vào phần tử mà nó được gắn vào nếu tuyến của nó hiện đang hoạt động, như vậy:

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

Ở trên sẽ thêm một lớp hoạt động vào thẻ neo nếu chúng ta hiện đang xem tuyến đường nhà.

Bản giới thiệu


2

Và trong phiên bản mới nhất của góc, bạn chỉ cần kiểm tra router.isActive(routeNameAsString). Ví dụ xem ví dụ dưới đây:

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

Và hãy chắc chắn rằng bạn không quên tiêm bộ định tuyến trong thành phần của mình.


1

Tôi đang tìm cách sử dụng điều hướng Twitter Bootstrap với Angular2, nhưng gặp khó khăn khi activelớp được áp dụng cho phần tử cha của liên kết đã chọn. Tìm thấy rằng giải pháp của @ alex-correia-santos hoạt động hoàn hảo!

Thành phần chứa các tab của bạn phải nhập bộ định tuyến và xác định nó trong hàm tạo của nó trước khi bạn có thể thực hiện các cuộc gọi cần thiết.

Đây là một phiên bản đơn giản hóa việc thực hiện của tôi ...

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

giả sử bạn muốn thêm CSS vào trạng thái / tab hoạt động của tôi. Sử dụng bộ định tuyếnLinkActive để kích hoạt liên kết định tuyến của bạn.

lưu ý: 'hoạt động' là tên lớp của tôi ở đây

<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

Tôi đang sử dụng bộ định tuyến góc ^3.4.7và tôi vẫn gặp vấn đề với routerLinkActivechỉ thị.

Nó không hoạt động nếu bạn có nhiều liên kết với cùng một url cộng với nó dường như không làm mới mọi lúc.

Lấy cảm hứng từ câu trả lời @tomaszbak Tôi đã tạo ra một thành phần nhỏ để thực hiện công việc


0

Mẫu html thuần túy giống như

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

0

bắt đầu với việc nhập RouterLinkActive trong .ts của bạn

nhập {RouterLinkActive} từ '@ angular / router';

Bây giờ sử dụng RouterLinkActive trong HTML của bạn

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

cung cấp một số css cho lớp "class_Name", vì khi liên kết này được kích hoạt / nhấp vào, bạn sẽ tìm thấy lớp này trên nhịp trong khi kiểm tra.


0

Một cách lập trình sẽ là làm điều đó trong chính thành phần. Tôi đã vật lộn ba tuần về vấn đề này, nhưng đã từ bỏ các tài liệu góc cạnh và đọc mã thực tế làm cho bộ định tuyến hoạt động và Thats về các tài liệu tốt nhất tôi có thể tìm thấy.

    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
}

Lưu ý :
Đối với cách lập trình, đảm bảo thêm liên kết bộ định tuyến và nó cần một phần tử con. Nếu bạn muốn thay đổi điều đó, bạn cần phải thoát khỏi những đứa trẻ trên superclass.nativeElement.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.