以下のように、アプリルーティングモジュールでいくつかのルートデータを定義しました。
const appRoutes:Routes = [
{path: '', component: LoginComponent, data:[{PageName:"Login Page"}]}]
次のようにapp.component.tsのappRoutesを使用してURLリダイレクト関連情報を取得できるように、データをグローバルに取得します。
export class AppComponent {
title = 'Welcome';
constructor(public router: Router, public authenticationService: AuthenticationService) {
this.router.events.subscribe(event => {
console.log("Url",event.urlAfterRedirects);
console.log("Page Name", router[PageName]); //Not working
}
ActivatedRouteを挿入しようとしましたが、各リダイレクト後に更新されません。
とにかく、ページ名を設定してグローバルapp.component.ts
。
filter
の代わりにsubscribe
を試し、イベントをループしてください
constructor(router:Router, route:ActivatedRoute) {
router.events
.filter(e => e instanceof NavigationEnd)
.forEach(e => {
this.title = route.root.firstChild.snapshot.data['PageName'];
});
}
次の動作デモを確認してください。 https://plnkr.co/edit/rBToHRaukDlrSKcLGavh?p=info
以下のようなルーターオブジェクトを使用して静的にルーティングした場合:
{パス: ''、pathMatch: 'full'、コンポーネント:NameComponent、データ:{variableName: 'variableValue'}}、
NgOnInit()では、ActivatedRouteオブジェクトを使用して、ルーター定義から渡したデータを回復できます。
ngOnInit(){this.localVariable = this.route.snapshot.data ['variableName']; }
Obs:私はAngular 5!
Angular 5+
このサービスは、現在のルート上のデータを取得します:(私の場合は「タイトル」)
import { Injectable } from "@angular/core";
import { Router, ActivatedRouteSnapshot } from "@angular/router";
@Injectable()
export class AppRoutingService {
constructor(private router: Router) { }
public getRouteTitle(): string {
return this.getRouteData("title");
}
private getRouteData(data: string): any {
const root = this.router.routerState.snapshot.root;
return this.lastChild(root).data[0][data];
}
private lastChild(route: ActivatedRouteSnapshot): ActivatedRouteSnapshot {
if (route.firstChild) {
return this.lastChild(route.firstChild);
} else {
return route;
}
}
}
コンポーネントロジック:
import { Component, OnInit, OnDestroy } from "@angular/core";
import { Router, NavigationEnd } from "@angular/router";
// SERVICES
import { RouterService } from "../../shared/services/router.service";
@Component()
export class NavSubmenuComponent implements OnInit, OnDestroy {
title: string = "";
routerEvents: any;
constructor(private router: Router, private routerService: RouterService) { }
ngOnInit() {
this.title = this.routerService.getRouteTitle();
this.routerEvents = this.router.events
.filter(event => event instanceof NavigationEnd)
.subscribe(() => {
this.title = this.routerService.getRouteTitle();
});
}
ngOnDestroy() {
this.routerEvents.unsubscribe();
}
}
NgAfterViewInitイベントまで待機する場合は、viewchildを使用してルーターアウトレットにリンクできます。
つまり.
@ViewChild('router')
private routerOutlet: RouterOutlet;
ngAfterViewInit() {
this.routerOutlet.activateEvents
.pipe(
map(() => this.routerOutlet
.activatedRouteData
)
)
.subscribe((data) => {
// Code
});
}
<router-outlet #router="outlet"></router-outlet>