web-dev-qa-db-ja.com

最後のページに戻る方法

Angular 2の最後のページに戻る賢い方法はありますか?

何かのようなもの

this._router.navigate(LASTPAGE);

たとえば、ページCには Go Back ボタン、

  • ページA - >ページCをクリックして、ページAに戻ります。

  • ページB - >ページCをクリックして、ページBに戻ります。

ルータはこの履歴情報を持っていますか?

242
Hongbo Miao

実際には、 "Back" APIを所有する組み込みのLocationサービスを利用することができます。

ここで(TypeScriptで):

import {Component} from '@angular/core';
import {Location} from '@angular/common';

@Component({
  // component's declarations here
})
class SomeComponent {

  constructor(private _location: Location) 
  {}

  backClicked() {
    this._location.back();
  }
}
427
Amir Sasson

最終版 of Angular 2.x/4.x - ここにドキュメントがあります https://angular.io/api/common/Location

/* TypeScript */

import { Location } from '@angular/common';
// import stuff here

@Component({
// declare component here
})
export class MyComponent {

  // inject location into component constructor
  constructor(private location: Location) { }

  cancel() {
    this.location.back(); // <-- go back to previous location on cancel
  }
}
79
Hinrich

Angular 5.2.9でテスト済み

ボタンの代わりにアンカーを使用する場合は、Angular Locationが機能するように、 パッシブリンク href="javascript:void(0)"を使用してアンカーを作成する必要があります。

app.component.ts

import { Component } from '@angular/core';
import { Location } from '@angular/common';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent {

  constructor( private location: Location ) { 
  }

  goBack() {
    // window.history.back();
    this.location.back();

    console.log( 'goBack()...' );
  }
}

app.component.html

<!-- anchor must be a passive link -->
<a href="javascript:void(0)" (click)="goBack()">
  <-Back
</a>
17
JavierFuentes

あなたのルートクラスにrouterOnActivate()メソッドを実装することができます、それは前のルートについての情報を提供します。

routerOnActivate(nextInstruction: ComponentInstruction, prevInstruction: ComponentInstruction) : any

その後、router.navigateByUrl()を使用して、ComponentInstructionから生成されたデータを渡すことができます。例えば:

this._router.navigateByUrl(prevInstruction.urlPath);
16
Sasxa

私は自分のアプリのどこでも再利用できるボタンを作りました。

このコンポーネントを作成する

import { Location } from '@angular/common';
import { Component, Input } from '@angular/core';

@Component({
    selector: 'back-button',
    template: `<button mat-button (click)="goBack()" [color]="color">Back</button>`,
})
export class BackButtonComponent {
    @Input()color: string;

  constructor(private location: Location) { }

  goBack() {
    this.location.back();
  }
}

次に戻るボタンが必要なときにそれを任意のテンプレートに追加します。

<back-button color="primary"></back-button>

注:これはAngular Materialを使用しています。そのライブラリを使用していない場合はmat-buttoncolorを削除してください。

11
Todd Skelton

ファイルシステムのように元に戻す必要があるときにも私のために働きます。 P.S @angular:「^ 5.0.0」

<button type="button" class="btn btn-primary" routerLink="../">Back</button>
9
Shevtsiv Andriy

RC4では:

import {Location} from '@angular/common';
6
Tomasz Bielawa

これをディレクティブに入れることができます。これは任意のクリック可能な要素に添付できます。

import { Directive, HostListener } from '@angular/core';
import { Location } from '@angular/common';

@Directive({
    selector: '[backButton]'
})
export class BackButtonDirective {
    constructor(private location: Location) { }

    @HostListener('click')
    onClick() {
        this.location.back();
    }
}

使用法:

<button backButton>BACK</button>
5
hansmaad

別のページに移動しているときに行った方法では、現在の場所を渡してクエリパラメータを追加します。

this.router.navigate(["user/edit"], { queryParams: { returnUrl: this.router.url }

コンポーネントのこのクエリパラメータを読む

this.router.queryParams.subscribe((params) => {
    this.returnUrl = params.returnUrl;
});

ReturnUrlが存在する場合は戻るボタンを有効にし、ユーザーが戻るボタンをクリックした場合

this.router.navigateByUrl(this.returnUrl); // Hint taken from Sasxa

これで前のページに移動できます。 location.backを使用する代わりに、ユーザーが直接あなたのページにアクセスし、location.backで戻るボタンを押した場合、ユーザーがあなたのWebページではない前のページにリダイレクトされる場合を考えてみましょう。

4
Puneeth Rai

これらすべての素晴らしい答えの後、私は私の答えが誰かを見つけて助けてくれることを願っています。私はルート履歴を追跡するために小さなサービスを書きました。ここに行きます。

import { Injectable } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';
import { filter } from 'rxjs/operators';

@Injectable()
export class RouteInterceptorService {
  private _previousUrl: string;
  private _currentUrl: string;
  private _routeHistory: string[];

  constructor(router: Router) {
    this._routeHistory = [];
    router.events
      .pipe(filter(event => event instanceof NavigationEnd))
      .subscribe((event: NavigationEnd) => {
        this._setURLs(event);
      });
  }

  private _setURLs(event: NavigationEnd): void {
    const tempUrl = this._currentUrl;
    this._previousUrl = tempUrl;
    this._currentUrl = event.urlAfterRedirects;
    this._routeHistory.Push(event.urlAfterRedirects);
  }

  get previousUrl(): string {
    return this._previousUrl;
  }

  get currentUrl(): string {
    return this._currentUrl;
  }

  get routeHistory(): string[] {
    return this._routeHistory;
  }
}
4
Anjil Dhamala

角度4ではpreserveQueryParamsを使います。例:

url: /list?page=1

<a [routerLink]="['edit',id]" [preserveQueryParams]="true"></a>

リンクをクリックすると、paramsを維持したままedit/10?page=1にリダイレクトされます。

ref: https://angular.io/docs/ts/latest/guide/router.html#!#link-parameters-array

2
Carlos Alberto

ベータ18以降

import {Location} from 'angular2/platform/common';

1
Albert

他の解決策

window.history.back();

0
Džan Operta