Angularでは、アクティブなルートをどのように決定しますか?


312

注: ここには多くの異なる答えがあり、そのほとんどは一度に有効でした。実際、Angularチームがルーターを変更したため、機能するものは何度も変更されました。最終的にAngular ルーターとなるルーター3.0バージョンは、これらのソリューションの多くを壊しますが、独自の非常にシンプルなソリューションを提供します。RC.3以降、推奨される解決策は[routerLinkActive]この回答に示すように使用することです。

Angularアプリケーション(私がこれを書いている現在の2.0.0-beta.0リリース)では、現在アクティブなルートが何であるかをどのように判断しますか?

私はBootstrap 4を使用するアプリに取り組んでおり、関連するコンポーネントが<router-output>タグに表示されているときにナビゲーションリンク/ボタンをアクティブとしてマークする方法が必要です。

ボタンの1つがクリックされたときに自分で状態を維持できることはわかっていますが、同じルートに複数のパスがある場合(メインナビゲーションメニューとメインコンポーネントのローカルメニューなど)はカバーされません)。

提案やリンクをいただければ幸いです。ありがとう。

回答:


356

新しいAngularルーターでは[routerLinkActive]="['your-class-name']"すべてのリンクに属性を追加できます。

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

または、クラスが1つだけ必要な場合は、単純化された非配列形式:

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

または、クラスが1つだけ必要な場合は、さらに単純な形式を使用します。

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

詳細については、不十分に文書化されたrouterLinkActiveディレクティブを参照してください。(私はほとんどこれを試行錯誤して理解しました。)

更新:routerLinkActiveディレクティブに関するより良いドキュメントがここにあります。(下のコメントで@Victor Hugo Arango A.に感謝します。)


4
ルートの子がアクティブなときにアクティブ化する方法はありますか?コードには@inputforオプションがありますがexact: false、現在のルートの兄弟もアクティブなときはいつでもクラスをアクティブにします。
Matej

1
@ GabrieleB-David私はそれをテストしていませんが、それがうまくいくと思いrouter.navigate()ます。routerLinkActiveこのリンクがアクティブなルートを表すかどうかの単なるインジケータです。
jessepinho 2016

7
この例では、[routerLinkActive]が<a />タグに追加されていますが、クラスが他の場所で必要な場合は、他の要素に配置することもできます。<ul> <li [routerLinkActive] = "['active']"> <a [routerLink]="[myRoute.Route]">
Oblivion2000

2
@jessepinho-試してみました-[routerLinkActive] = "'active'"は、a-tagに[routerLink]がある場合にのみ機能します。[routerLink]の代わりに(click)= "navitageTo( '/ route')"があり、その関数でthis.router.navigate(route)を呼び出した場合、新しいコンポーネントは読み込まれますが、アクティブなCSSクラスは適用されません。私はthis.router.navigate(..)のほかにその関数で他の何かをしようとしています。
Mickael Caruso

2
公式ドキュメントの例では、あなたを助けることができる:angular.io/docs/ts/latest/api/router/index/...
ヴィクトル・ユゴーアランゴA.

69

これについては別の質問で回答しましたが、この質問にも関係があると思います。元の回答へのリンクは次のとおりです 。Angular 2:パラメータを使用してアクティブなルートを決定する方法は?

私は現在の場所が何であるかを正確に知る必要なく(ルート名を使用して)アクティブなクラスを設定しようとしています。これが私がこれまでに得た最良の解決策は、クラスで使用可能なisRouteActive関数を使用することです。Router

router.isRouteActive(instruction): Booleanルートであるつのパラメータ取りInstructionオブジェクトを返すtrueか、false現在のルートのその命令が成立するか否かを。あなたは、ルートを生成することができますInstruction使用してRouterのを(linkParams:配列)を生成します。LinkParamsはrouterLinkディレクティブに渡される値とまったく同じフォーマットに従います(例:)router.isRouteActive(router.generate(['/User', { user: user.id }]))

これは、RouteConfigがどのようになるかを示していますパラメーターの使用法を示すために少し調整しました)

@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
パスに一致する正規表現の代わりにAngular APIを使用するため、このソリューションは受け入れられたものよりも優れていると思います。それはまだ少し醜いですが、それができるのは素晴らしいことですrouter.isRouteActive('Home')
Philip

2
私はので、多分いくつかが有用であることが可能のため、ソリューションを実装しようとしている時にいくつかの問題に直面していました:stackoverflow.com/questions/35882998/...
ニキータVlasenko

5
Routerクラスのコンストラクターを配置することを忘れないでください
Nikita Vlasenko

2
最新のAngular 2バージョンnameasは、ルーター構成オブジェクトの代わりに使用しました。
ComFreek 2016年

9
これは代わりにrc1で使用できます。router.urlTree.contains(router.createUrlTree(['Home']))
FrantišekŽiačik'15年

35

このリンクで遭遇した問題を解決しましたが、あなたの質問に対する簡単な解決策があることがわかりました。router-link-active代わりにスタイルで使用できます。

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

2
私はこれが受け入れられる答えであると信じています。Angular2のルーターはこれを自動的に追加します。
ガブ2016

2
残念ながら、そのクラスは<li>ではなく<a>に追加されます
laifjei

残念ながら、実際にはうまく機能しません。動的に生成されたメニューが1つあり、router-link-activeクラスがアクティブaまたはに追加されていませんli。しかし、ブートストラップnav-tabsを使用している場所が1つあり、そこで機能します。
2016

33

https://github.com/angular/angular/pull/6407#issuecomment-190179875に基づく@ alex-correia-santosの回答に対する小さな改善

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 {background-color:aliceblue;のスタイル } ]。+1機能
Pratik Kelwalkar

これにより、ルーターをプライベートにすることができます。
Kelvin Dealca 2016

これははるかに優れたソリューションであり、コンストラクターの作成やルーターへの受け渡しなどの小さなことを忘れてしまう初心者に特に役立ちます。あなたは完全にチェックに値します。
方法論担当者2016年

30

次のように、Locationオブジェクトをコントローラーに挿入してを確認することで、現在のルートを確認できますpath()

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

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

最初に必ずインポートする必要があります。

import {Location} from "angular2/router";

次に、正規表現を使用して、返されたパスと照合し、アクティブなルートを確認できます。使用LocationLocationStrategyているものに関係なく、クラスは正規化されたパスを返すことに注意してください。だから、あなたが使用している場合でも、HashLocationStragegy返されるパスはまだ形式のものであろう/foo/bar ではありません #/foo/bar


17

現在アクティブなルートが何であるかをどのように判断しますか?

更新: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
}

続きを見る...


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、RC.4ではデフォルトになります。


11

現在、ブートストラップ4でrc.4を使用していますが、これは私にとっては完璧に機能します。

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

これはurlで機能します:/ home


正確なオプションの目的は何ですか?それはサブパスと一致しません/home/whateverか?
Michael Oryl 2016

はい、exactつまり、そのルートは同じ名前になります。そして、これは、Twitterブートストラップなどのツールで使用する場合に必要です。すでにアクティブなリンク状態を処理しており、exactオプションがないと機能しません。(それがコアでどのように機能するかはわかりません、私はそれを試してみましたが、私のために機能しました)
Artem Zinoviev

7

以下は、RouteDataを使用して、現在のルートに応じてmenuBarアイテムをスタイルするメソッドです。

RouteConfigには、タブ付きのデータ(現在のルート)が含まれています。

@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

typescriptを使用しない例を追加すると思いました。

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

routerLinkActive変数はテンプレート変数にバインドされ、その後、必要に応じて再利用します。残念ながら、唯一の注意点は、パーサーがヒットするに解決する必要があるため、これを<section>要素上にすべて持つことはできないということです。#home<section>


アクティブなルートに条件を適用するのに最適なソリューションです。@ angular / routerなどが機能しなかった場合。
Rohit Parte、

うわー、これはとても役に立ちます。ありがとう!
ユリアン

6

RouterAngular 2ではisRouteActive、RCはgenerateメソッドとメソッドを定義しなくなりました。

urlTree -現在のURLツリーを返します。

createUrlTree(commands: any[], segment?: RouteSegment) -コマンドの配列を現在のURLツリーに適用し、新しいURLツリーを作成します。

フォローしてみてください

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

通知、routeSegment : RouteSegmentコンポーネントのコンストラクタに注入する必要があります。


6

2.0.0-rc.1nullルートパスを考慮したAngularバージョンでアクティブなルートスタイルを追加する完全な例を次に示します(例path: '/'

app.component.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 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

Angular 8以降、これは機能します:

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

{ exact: true } URLと一致することを確認します。


5

2020年に[routerLink]を持たない要素にアクティブクラスを設定する場合-簡単に行うことができます:

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

ありがとう、イゴール。これが最良の解決策です。
Dmitry Grinko

ご意見ありがとうございます:)
Kurkov Igor

4

別の回避策。Angular Router V3 Alphaの方がはるかに簡単です。ルーターを注入する

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>

インポートするとすぐに、nullエラーのプロパティ「isSkipSelf」を読み取ることができません。何か案は?
atsituab 2016年


4

以下は、これまでにリリースされたすべてのAngular 2 RCバージョンのこの質問に対する回答です。

RC4およびRC3

リンクまたはリンクの祖先にクラスを適用する場合:

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

/ homeは、Route v3以降、Route Objectにnameプロパティが存在しないため、ルートの名前ではなく、URLである必要があります。

このリンクの routerLinkActiveディレクティブの詳細。

現在のルートに基づいて任意のdivにクラスを適用する場合:

  • ルーターをコンポーネントのコンストラクターに挿入します。
  • 比較のためのユーザーrouter.url。

例えば

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

RC2およびRC1

router.isRouteActiveとclass。*の組み合わせを使用します。たとえば、ホームルートに基づいてアクティブクラスを適用します。

名前とURLの両方をrouter.generateに渡すことができます。

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

4

routerLinkActiveリンクがあり、いくつかのクラスを適用したいという単純な場合に使用すると便利です。しかし、routerLinkがない場合や、パイプを作成して使用するためにさらに何かが必要な場合など、より複雑なケースでは:

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

パイプの依存関係にパイプを含めることを忘れないでください;)


素晴らしいアイデアですが、angular2.0.0rc3でthis.router.isRouteActive ...をthis._location.path()に変更して、これを上に置きます:import {Location} from '@ angular / common';
KamilKiełczewski2016年

2
コードから何かが欠けているようです。どこがcontainsTree定義されていますか?
–ØysteinAmundsen、2016

4

Angularバージョン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

Routerクラスのインスタンスは実際にはObservableであり、変更されるたびに現在のパスを返します。これは私がそれをする方法です:

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

そして、私のHTMLで:

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

1
.subscribeはルーターインスタンスでは使用できません。
Shivang Gupta

3

受け入れられた回答のコメントの1つで述べたように、routerLinkActiveディレクティブは実際の<a>タグのコンテナーにも適用できます。

したがって、たとえば、リンクを含むタグにアクティブクラスを適用する必要があるTwitterのブートストラップタブでは、次のようになります<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

Angular 5ユーザー向けのシンプルなソリューションは、routerLinkActiveリストアイテムに追加するだけです。

routerLinkActiveディレクティブを介してルートに関連付けられているrouterLink指示。

次のように、ルートが現在アクティブである場合は、接続先の要素に追加されるクラスの配列を入力として受け取ります。

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

上記で現在ホームルートを表示している場合は、アンカータグにアクティブのクラスが追加されます。

デモ


2

また、angularの最新バージョンでは、単にcheckを実行でき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

Angular2でTwitter Bootstrapスタイルのナビゲーションを使用する方法を探していましたactiveが、選択したリンクの親要素にクラスを適用するのに問題がありました。@ alex-correia-santosのソリューションが完全に機能することがわかりました。

タブを含むコンポーネントは、必要な呼び出しを行う前にルーターをインポートし、そのルーターをルーターで定義する必要があります。

これが私の実装の簡単なバージョンです...

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

CSSをアクティブな状態/タブに追加するとします。routerLinkActiveを使用してルーティングリンクをアクティブにします。

注: 'active'はここに私のクラス名です

<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のリンクが複数ある場合は機能せず、常に更新されないようです。

@tomaszbakの回答に触発されて仕事をするための小さなコンポーネントを作成しました


0

純粋なhtmlテンプレートは

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

0

.tsにRouterLinkActiveをインポートすることから始めます

'@ angular / router'から{RouterLinkActive}をインポートします。

次に、HTMLでRouterLinkActiveを使用します

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

このリンクがアクティブ/クリックされると、検査中にこのクラスがスパン上にあることがわかるため、クラス「class_Name」にcssをいくつか提供します。


0

プログラム的な方法は、コンポーネント自体でそれを行うことです。私はこの問題に3週間苦労しましたが、角度のあるドキュメントをあきらめて、routerlinkactiveを機能させる実際のコードと、私が見つけた最高のドキュメントについての説明を読みました。

    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.