Angular'da etkin rotayı nasıl belirliyorsunuz?


312

NOT: Burada birçok farklı cevap vardır ve çoğu şu anda geçerlidir. Gerçek şu ki, Açısal ekip Yönlendiricisini değiştirdikçe, çalışanlar birkaç kez değişti. Yönlendirici 3,0 sonunda olacak versiyonu bu çözümlerin birçoğu Açısal sonları yönlendirici, ancak teklifler kendine ait bir çok basit bir çözüm. RC.3 itibariyle, tercih edilen çözüm bu cevapta gösterildiği gibi kullanmaktır .[routerLinkActive]

Açısal bir uygulamada (bunu yazarken 2.0.0-beta.0 sürümünde geçerli), şu anda etkin olan rotanın ne olduğunu nasıl belirlersiniz?

Bootstrap 4 kullanan bir uygulama üzerinde çalışıyorum ve ilişkili bileşen bir <router-output>etikette gösterilirken gezinme bağlantılarını / düğmelerini etkin olarak işaretlemek için bir yola ihtiyacım var .

Düğmelerden birine tıklandığında durumu kendim koruyabileceğimin farkındayım, ancak aynı rotada birden fazla yol olması durumunda (ana navigasyon menüsünün yanı sıra ana bileşende yerel bir menü de söz konusu değildir) ).

Herhangi bir öneri veya bağlantı takdir edilecektir. Teşekkürler.

Yanıtlar:


355

Yeni Açısal yönlendirici[routerLinkActive]="['your-class-name']" ile tüm bağlantılarınıza bir özellik ekleyebilirsiniz :

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

Veya yalnızca bir sınıf gerekiyorsa basitleştirilmiş dizi dışı biçim:

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

Veya yalnızca bir sınıfa ihtiyaç duyulursa daha da basit bir biçim:

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

Daha fazla bilgi için kötü belgelendirilmiş routerLinkActiveyönerge'ye bakınız . (Bunu çoğunlukla deneme yanılma yoluyla anladım.)

GÜNCELLEME: routerLinkActiveDirektifle ilgili daha iyi dokümantasyona buradan ulaşabilirsiniz . (Aşağıdaki yorumlarda @Victor Hugo Arango A.'ye teşekkürler.)


4
Rotanın çocukları aktifken etkinleşmesi için herhangi bir yol var mı? Kodun bir @inputfor seçenekleri vardır, ancak exact: falsegeçerli yolun kardeşleri de etkin olduğunda sınıfı etkinleştirir.
Matej

1
@ GabrieleB-David Test etmedim, ama router.navigate()bunun işe yarayacağını düşünürdüm. routerLinkActiveyalnızca bu bağlantının etkin rotayı temsil edip etmediğinin bir göstergesidir.
jessepinho

7
Verilen örnekte, [routerLinkActive] <a /> etiketine eklenir, ancak sınıf başka bir yerde isteniyorsa diğer öğelere de eklenebilir. <ul> <li [routerLinkActive] = "['aktif']"> <a [routerLink sızdı="[myRoute.Route Cialis">
Oblivion2000

2
@jessepinho - Denedim - [routerLinkActive] = "'aktif'" yalnızca a etiketinde [routerLink] varsa çalışır. [RouterLink] yerine (click) = "navitageTo ('/ route')" varsa ve bu işlevde, this.router.navigate (route) adını verdiyseniz, yeni bileşen yüklenir ancak etkin CSS sınıfınız kazanır ' t uygulanmalıdır. This.router.navigate (..) yanında bu işlevi başka bir şey yapmaya çalışıyorum.
Mickael Caruso

2
Resmi belgelerdeki örnek size yardımcı olabilir: angular.io/docs/ts/latest/api/router/index/…
Victor Hugo Arango A.

69

Bunu başka bir soruda cevapladım ama bunun da bununla ilgili olabileceğine inanıyorum. Orijinal cevaba bir link: Açısal 2: Aktif rotayı parametrelerle nasıl belirleyebilirim?

Geçerli konum (rota adını kullanarak) tam olarak ne olduğunu bilmek zorunda kalmadan aktif sınıfı ayarlamaya çalışıyorum . Şimdiye kadar var en iyi çözüm sınıfta bulunan isRouteActive işlevini kullanmaktır .Router

router.isRouteActive(instruction): Booleanbir rota Instructionnesnesi olan bir parametre alır ve döndürür trueveya falsebu komutun geçerli rota için geçerli olup olmadığını döndürür . 'S create (linkParams: Array) öğesiniInstruction kullanarak bir rota oluşturabilirsiniz . LinkParams, bir routerLink yönergesine (ör. ) İletilen bir değerle tam olarak aynı biçimi izler .Routerrouter.isRouteActive(router.generate(['/User', { user: user.id }]))

Bu nasıl RouteConfig gibi görünebilir (I params kullanımını göstermek için bunu biraz küçük değişiklikler yaptık) :

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

Ve Görünüm şöyle görünecektir:

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

Bu sorun için şimdiye kadar tercih ettiğim çözüm oldu, sizin için de yararlı olabilir.


1
Bu çözüm kabul edilen çözümden daha iyi olduğunu düşünüyorum, çünkü yolla eşleşen regex yerine Angular API'leri kullanıyor. Yine de biraz çirkin, sadece yapabilmek güzel olurdu router.isRouteActive('Home').
Philip

2
Çözümü uygulamaya çalışırken bazı sorunlarla karşılaştım, belki bazıları için yararlı olabilir: stackoverflow.com/questions/35882998/…
Nikita Vlasenko

5
Routersınıfın yapıcı koymak için unutmamalı
Nikita Vlasenko

2
En son Angular 2 sürümünde , yönlendirici yapılandırma nesnesi nameyerine kullandım as.
ComFreek

9
Bu, rc1 yerine kullanılabilir:router.urlTree.contains(router.createUrlTree(['Home']))
František Žiačik

35

Bu bağlantıda karşılaştığım bir sorunu çözdüm ve sorunuz için basit bir çözüm olduğunu öğrendim. Bunun router-link-activeyerine stillerinizde kullanabilirsiniz .

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

2
Bunun kabul edilen cevap olması gerektiğine inanıyorum. Angular2'nin yönlendiricisi bunu sizin için otomatik olarak ekleyecektir.
Gabu

2
ne yazık ki, bu sınıf <li> değil, <a> ekler
laifjei

ne yazık ki gerçekten iyi çalışmıyor. i dinamik olarak oluşturulan bir menü var ve router-link-activesınıf etkin aveya eklenmiyor li. ama bootstrap kullandığım bir yer nav-tabsvar ve orada çalışıyor.
Shri

33

Https://github.com/angular/angular/pull/6407#issuecomment-190179875 temelli @ alex-correia-santos cevabında küçük gelişme

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

Ve şu şekilde kullanın:

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

ve styles : [.active {background-color: aliceblue bileşenindeki bir stil ; } ]. +1 işe yarıyor
Pratik Kelwalkar

Harika bir çözüm, bununla yönlendiriciyi özel yapabilirsiniz.
Kelvin Dealca

Bu çok daha iyi bir çözümdür ve özellikle kurucuyu oluşturmak ve yönlendiriciye geçmek gibi küçük şeyleri unutan bir çaylak için yararlıdır! Çeki tamamen hakediyorsun.
Methodician

30

LocationNesneyi kontrolörünüze enjekte ederek ve şu şekilde kontrol ederek mevcut rotayı kontrol edebilirsiniz path():

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

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

Önce içe aktardığınızdan emin olmanız gerekir:

import {Location} from "angular2/router";

Ardından, hangi yolun etkin olduğunu görmek için döndürülen yolla eşleşecek normal bir ifade kullanabilirsiniz. LocationSınıfın, hangisini LocationStrategykullanırsanız kullanın normalleştirilmiş bir yol döndürdüğünü unutmayın . Kullandığınız Yani bile HashLocationStragegyiade yolları hala biçimde olacaktır /foo/bar değil #/foo/bar


17

şu anda aktif olan rotanın ne olduğunu nasıl belirlersiniz?

GÜNCELLEME: Angular2.4.x uyarınca güncellenmiştir

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
}

daha fazla gör...


14

Etkin rotaları işaretlemek routerLinkActiveiçin kullanılabilir

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

Bu aynı zamanda,

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

Eğer kısmi eşleşme de kullanılmasını işaretlenmiş olmalıdır

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

Bildiğim kadarıyla exact: falseRC.4 varsayılan olacak


11

Şu anda bootstrap 4 ile rc.4 kullanıyorum ve bu benim için mükemmel çalışıyor:

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

Bu url için çalışır: / home


Kesin seçeneğin amacı nedir? Bu, aşağıdaki alt yollarla eşleşmiyor /home/whatevermu?
Michael Oryl

evet, exactyani, bu rota aynı ada sahip olacak. Ve twitter bootstrap gibi araçlarla kullanmayı planlıyorsanız bu gereklidir. Zaten aktif bağlantı durumunu ele alır ve exactseçenek olmadan çalışmaz. (çekirdekte nasıl çalıştığından emin değilim, denedim ve benim için çalışıyordu)
Artem Zinoviev

7

Geçerli rotaya bağlı olarak menuBar öğelerini biçimlendirmek için RouteData kullanan yöntem aşağıdadır:

RouteConfig, sekmeli veriler (mevcut rota) içerir:

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

Bir parça düzen:

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

Sınıf:

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

Sadece herhangi bir daktilo kullanmayan bir örnek eklemek düşündüm:

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

routerLinkActiveDeğişken bir şablon değişkene bağlıdır ve daha sonra gereken şekilde kullanılan tekrar. Ne yazık ki tek uyarı, ayrıştırıcı vurmadan önce çözülmesi gereken tüm bunları <section>elemanın üzerine alamamanızdır .#home<section>


Etkin rotalara koşul uygulamak için mükemmel çözüm. @ Açısal / yönlendirici veya başka bir yerde çalışmadı.
Rohit Parte

Vay canına, bu çok yardımcı oluyor. Teşekkürler!
Yulian

6

RouterAngular 2 RC'de artık tanım isRouteActiveve generateyöntemler yoktur.

urlTree - Geçerli URL ağacını döndürür.

createUrlTree(commands: any[], segment?: RouteSegment) - Geçerli URL ağacına bir dizi komut uygular ve yeni bir URL ağacı oluşturur.

Takip etmeyi deneyin

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

uyarı, routeSegment : RouteSegmentbileşenin yapıcısına enjekte edilmelidir.


6

İşte Açısal sürümde aktif rota stil eklemek için tam bir örnek 2.0.0-rc.1(örneğin hesap boş kök yolları dikkate alır path: '/')

app.component.ts -> Rotalar

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 RC 4 için çözüm:

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

Açısal 8'den itibaren, bu işe yarar:

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

{ exact: true } URL ile eşleşmesini sağlar.


5

2020 yılında [routerLink] özelliği olmayan bir öğede etkin sınıf ayarlamak istiyorsanız - şunları yapabilirsiniz:

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

Teşekkürler, Igor. Bu en iyi çözümdür.
Dmitry Grinko

Geri bildiriminiz için teşekkür ederiz :)
Kurkov Igor

4

Başka bir geçici çözüm. Açısal Yönlendirici V3 Alpha'da çok daha kolay. Router enjekte ederek

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

export class AppComponent{

    constructor(private router : Router){}

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

kullanım

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

En kısa sürede onu almak gibi bir null hata 'isSkipSelf' özelliği okunamıyor olsun. herhangi bir fikir?
atsituab

4

Angular2 RC2'de bu basit uygulamayı kullanabilirsiniz

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

bu, activeeşleşen url ile öğeye sınıf ekleyecektir , hakkında daha fazla bilgiyi buradan edinebilirsiniz


4

Aşağıda, Angular 2 RC sürümlerinin bugüne kadar yayınlanan tüm sürümleri için bu sorunun yanıtları bulunmaktadır:

RC4 ve RC3 :

Sınıfı bağlantıya veya bağın atasına uygulamak için:

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

/ home, Yönlendirici v3'ten itibaren Rota Nesnesinde name özelliği bulunmadığından, yolun adı değil, URL adı olmalıdır.

Bu bağlantıdaki yönlendiriciLinkActive yönergesi hakkında daha fazla bilgi .

Geçerli rotaya göre herhangi bir div'a sınıf uygulamak için:

  • Router'ı bileşen yapıcısına enjekte edin.
  • Karşılaştırma için kullanıcı yönlendirici.url.

Örneğin

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

RC2 ve RC1 :

Router.isRouteActive ve class. * Kombinasyonunu kullanın. örneğin, Güzergaha göre aktif sınıf uygulamak.

Ad ve URL'nin her ikisi de yönlendiriciye aktarılabilir.

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

4

routerLinkActiveBasit durumlarda, bir bağlantı olduğunda ve bazı sınıfları uygulamak istediğinizde kullanmak iyidir. Ancak bir routerLink'iniz olmayabileceği veya daha fazlasına ihtiyacınız olan daha karmaşık durumlarda bir boru oluşturabilir ve kullanabilirsiniz :

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

sonra:

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

ve boru bağımlılıklarına boru eklemeyi unutmayın;)


Güzel bir fikir ama angular2.0.0rc3 bu this.router.isRouteActive ... değiştirmek this._location.path () ve üstüne koymak: {@} '@ angular / common' ithal;
Kamil Kiełczewski

2
Kodda bir şey eksik görünüyor. Nerede containsTreetanımlı?
Øystein Amundsen

4

Açısal sürüm 4+ için herhangi bir karmaşık çözüm kullanmanıza gerek yoktur. Sadece kullanabilirsiniz [routerLinkActive]="'is-active'".

Bootstrap 4 nav bağlantısı olan bir örnek için:

    <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

Router sınıfının bir örneği aslında bir Gözlemlenebilir ve her değiştiğinde geçerli yolu döndürür. Bunu nasıl yaparım:

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

Ve sonra HTML'imde:

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

1
.subscribe, Router örneğinde kullanılamıyor.
Shivang Gupta

3

Kabul edilen cevabın yorumlarından birinde belirtildiği gibi, routerLinkActivedirektif ayrıca fiili bir konteynere de uygulanabilir.<a> etiketin .

Örneğin , etkin sınıfın bağlantıyı içeren etikete uygulanması gereken Twitter Bootstrap sekmeleriyle<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>

Oldukça temiz! Direktifin etiketin içeriğini denetlediğini ve direktifle bir <a>etiket aradığını varsayalım routerLink.


2

Açısal 5 kullanıcı için basit bir çözüm, sadece routerLinkActive liste öğesine .

Bir routerLinkActiveyönerge, bir routerLinkyönerge içerisindeki bir güzergahla ilişkilendirilir .

Şu anda rota etkinse, bağlı olduğu öğeye ekleyeceği sınıfların bir dizisini girdi olarak alır, şöyle:

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

Yukarıdakiler, şu anda ana güzergahı görüntülüyorsak, bağlantı etiketine bir aktif sınıf ekleyeceğiz.

gösteri


2

Ve açısalın son sürümünde, kontrol edebilirsiniz router.isActive(routeNameAsString). Örneğin aşağıdaki örneğe bakın:

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

Ve bileşeninize enjektör yönlendirmeyi unutmadığınızdan emin olun.


1

Angular2 ile bir Twitter Bootstrap stili nav kullanmanın bir yolunu arıyordum, ancak active seçilen bağlantının üst öğesine uygulanan sınıfı . @ Alex-correia-santos'un çözümünün mükemmel işlediğini bulduk!

Sekmelerinizi içeren bileşenin, gerekli çağrıları yapabilmeniz için yönlendiriciyi içe aktarması ve yapıcısında tanımlaması gerekir.

İşte uygulamamın basitleştirilmiş bir sürümü ...

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

diyelim ki etkin durumuma / sekmeme CSS eklemek istiyorsunuz. Kullanım routerLinkActive sizin yönlendirme linki aktive etmek.

not: 'active' burada benim sınıf adım

<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

Açısal yönlendirici kullanıyorum ^3.4.7ve hala routerLinkActiveyönergeyle ilgili sorunlar yaşıyorum .

Aynı url ile birden fazla bağlantınız varsa, her zaman yenilenmiyor gibi görünüyor.

Esinlenen @tomaszbak cevabı İşi yapmak için küçük bir bileşen oluşturdum


0

Saf html şablonu gibi olmak

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

0

.ts'nize RouterLinkActive aktarımı ile başlayın

'@ açısal / yönlendirici'den {RouterLinkActive} dosyasını içe aktarın;

Şimdi HTML'nizde RouterLinkActive kullanın

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

"class_Name" sınıfına biraz css sağlayın, çünkü bu bağlantı aktif / tıklandığında denetim sırasında bu sınıfı span'da bulacaksınız.


0

Programlı bir yol bunu bileşenin kendisinde yapmak olacaktır. Bu konuda üç hafta mücadele ettim, ancak açısal dokümanlardan vazgeçtim ve yönlendirici bağlantıyı çalıştıran gerçek kodu ve bulabildiğim en iyi dokümanlar hakkında Thats'ı okudum.

    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
}

Not :
Programlı yol için, yönlendirici bağlantısını eklediğinizden emin olun ve alt öğe alır. Bunu değiştirmek isterseniz, çocuklardan kurtulmanız gerekir superclass.nativeElement.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.