2016-02-17 5 views
117

Есть ли умный способ вернуться на последнюю страницу в Angular 2?Как вернуться на последнюю страницу

Что-то вроде

this._router.navigate(LASTPAGE); 

Например, страница C имеет кнопку Вернуться,

  • Страница А -> страница C, нажмите на него, обратно на страницу A.

  • Страница B -> Страница C, щелкните по нему, назад к странице B.

Есть ли у маршрутизатора эта информация об истории?

ответ

210

На самом деле вы можете воспользоваться встроенным сервисом определения местоположения, которому принадлежит «Назад» api.

Здесь (машинопись):

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(); 
    } 
} 
+0

Существует нет встроенных в службу поддержки – Justin

+0

привет Джастин, пожалуйста, обратитесь к https://angular.io/docs/js/latest/api/router/Location-class.html#!#back-anchor вы бы см. документацию по угловому 2 и посмотрите, что есть «Встроенная» задняя часть() –

+26

Местоположение должно быть импортировано из «углового2/роутера» в более ранних версиях углового 2. В новых версиях оно должно быть от «@ углового/общего ». –

12

Вы можете применить метод routerOnActivate() в своем классе маршрута, он предоставит информацию о предыдущем маршруте.

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

Затем вы можете использовать router.navigateByUrl() и передавать данные, полученные от ComponentInstruction. Например:

this._router.navigateByUrl(prevInstruction.urlPath); 
+0

Это действительно актуально для Angular 2.1.0? – smartmouse

+1

@smartmouse Я так не думаю, есть документация для 'routerOnActivate' –

+2

Ссылка routerOnActivate() в этом ответе не работает. Кажется, это не способ сделать это в версии выпуска. – rmcsharry

0

Так как бета-18:

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

5

В RC4:

import {Location} from '@angular/common'; 
43

В окончательной версии угловых 2.х/4.x - вот документы https://angular.io/docs/ts/latest/api/common/index/Location-class.html

/* 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 
    } 
} 
4

Как я это сделал во время навигации к другой странице добавления параметров запроса, передавая текущее местоположение

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, он перенаправит пользователя на предыдущую страницу, которая не будет вашей веб-страницей.

+0

Необходимо импортировать ActivatedRoute и использовать это вместо Router на подписке queryParams (например, this.route.queryParams.subscribe), но в противном случае, похоже, работает! –

+0

для меня он отлично работает с самим маршрутизатором даже в угловых 4 –

2

также работать для меня, когда мне нужно как в файловой системе. P.S. @angular: "^ 5.0.0"

<button type="button" class="btn btn-primary" routerLink="../">Back</button> 
+0

Я надеялся, что это сработает, но это вернется к следующему Маршруту над ним - не к тому маршруту, на котором вы были, перед тем, как перейти на страницу. Полезно знать, что это существует, но если у вас есть несколько точек входа для вашего компонента, этот метод только вернется к маршруту над ним, а не к тому месту, откуда вы пришли. –

+0

Как я пишу «когда мне нужно вернуться назад, как в файловой системе» :) Для меня это поведение также было неожиданным. –

2

Я сделал кнопку, я могу повторно использовать в любом месте на мое приложение.

Создать этот компонент

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> 

Примечание: Это используется Угловое материал, если вы не используете эту библиотеку затем удалите mat-button и color.

+0

Этот подход работает с именованными маршрутизаторами? Скажем, у меня есть несколько страниц и только хочу вернуться к одному из них, будет ли это работать? – rrd

+0

Для этой ситуации вам придется использовать другой подход. Если бы у вас была одна и та же кнопка в двух разных маршрутизаторах, они, вероятно, оба сделают то же самое и вернутся к последней розетке маршрутизатора, которая была изменена. –

+0

Для названных выходов я обнаружил, что этот подход сработал: this.router.navigate (['../'], {relativeTo: this.route}) – rrd