ルート変更を保存できる小さなサービスを作成しました。
import { Injectable } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
@Injectable()
export class RouteState {
private previousUrl: string;
private currentUrl: string;
constructor(private router: Router) {
this.currentUrl = this.router.url;
router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
this.previousUrl = this.currentUrl;
this.currentUrl = event.url;
};
});
}
public getPreviousUrl() {
return this.previousUrl;
}
}
ただし、ルートが変更されるたびに、vars currentUrlおよびpreviousUrlは未定義です。私は何か間違ったことをしていますか?
Angularの位置情報サービスを使用します。angularに組み込まれており、次のように '@ angular/common'からインポートします。
import { Component, OnInit, Input } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Location } from '@angular/common';
import { Hero } from '../hero';
import { HeroService } from '../hero.service';
@Component({
selector: 'app-hero-detail',
templateUrl: './hero-detail.component.html',
styleUrls: [ './hero-detail.component.css' ]
})
export class HeroDetailComponent implements OnInit {
@Input() hero: Hero;
constructor(
private location: Location
) {}
goBack() {
this.location.back();
}
}
次に、location.back()を使用して前のページに移動します。これは実際の例です:
以前のルートが必要な場合は、このようなオブザーバブルを作成できます
get previousRoute$(): Observable<string> {
return this.router.events.pipe(
filter(e => e instanceof RoutesRecognized),
pairwise(),
map((e: [RoutesRecognized, RoutesRecognized]) => e[0].url)
);
}
これで、このオブザーバブルをサブスクライブして任意のアクションを実行できます(OnDestroyイベントでこのオブザーバブルをサブスクライブ解除してください)。
this.previousRoute$.subscribe(url => {
//perform your action
});
注:このオブザーバブルは、ユーザーが2番目のナビゲーションにいるときにイベントの発行を開始します。
ルーターから、メソッドを使用して最後に成功したナビゲーションを取得できます
const lastSuccessfulNavigation = router.getLastSuccessfulNavigation();
そのオブジェクトは type Navigation
であり、他のプロパティの中にpreviousNavigation
プロパティが含まれ、そのプロパティも同じNavigation
タイプです。
const previousNavigation = lastSuccessfulNavigation.previousNavigation;
以前のナビゲーションは type UrlTree
であり、navigateByUrl
メソッドでのナビゲーションに直接使用できます。
router.navigateByUrl(previousNavigation);
Angularによって提供される位置情報サービスを使用したくない場合は、次のサービスを試すことができます。
// service to get prev route
@Injectable()
export class RouteBackService {
public getPreviousUrl(routeArray): string {
let prevRoute = '';
for (let i = 0; i < routeArray.length - 1; i++) {
if (routeArray[i].url._value[0].length > 0) {
prevRoute += routeArray[i].url._value[0].path + '/';
}
}
return prevRoute.slice(0, -1);
}
}
// in the component from where you want to route back
export class YourComponent {
constructor (private _aRoute: ActivatedRoute,
private _routeBack: RouteBackService
private _router: Router) {}
goBack() {
const prevRoute=this._routeBack.getPreviousUrl(this._aRoute.pathFromRoot);
this._router.navigate([prevRoute]);
}
}