如何回到最后一页

时间:2016-02-17 02:47:55

标签: angular angular2-routing

有没有一种聪明的方法可以回到Angular 2的最后一页?

这样的东西
this._router.navigate(LASTPAGE);

例如,页面C有一个 Go Back 按钮,

  • 页面A - >页面C,单击它,返回页面A.

  • Page B - >页面C,单击它,返回到页面B.

路由器是否有此历史信息?

17 个答案:

答案 0 :(得分:436)

实际上,您可以利用内置的位置服务,该服务拥有“后退”API。

这里(在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();
  }
}

答案 1 :(得分:80)

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

答案 2 :(得分:18)

使用Angular 5.2.9

进行测试

如果您使用锚点而不是按钮,则必须使用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>

答案 3 :(得分:16)

您可以在路由类上实现routerOnActivate()方法,它将提供有关以前路由的信息。

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

然后,您可以使用router.navigateByUrl()并传递从ComponentInstruction生成的数据。例如:

this._router.navigateByUrl(prevInstruction.urlPath);

答案 4 :(得分:11)

我制作了一个按钮,我可以在我的应用上的任何地方重复使用。

创建此组件

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

答案 5 :(得分:9)

当我需要像文件系统一样向后移动时,也适合我。 的 P.S。 @angular:&#34; ^ 5.0.0&#34;

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

答案 6 :(得分:6)

在RC4中:

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

答案 7 :(得分:5)

您可以将其放入可以附加到任何可点击元素的指令中:

this.setState()

用法:

import React, { Component } from "react";
import { connect } from "react-redux";
import PropTypes from "prop-types";
import { withRouter } from "react-router-dom";
import Select from "react-select";
import { clearCurrentProfile, getCurrentProfile } from "../actions";

const options = [
  { value: "todos?userId=1", label: "Todos" },
  { value: "comments?postId=1", label: "Comments" },
  { value: "users?id=1", label: "Users" },
  { value: "albums?userId=1", label: "Albums" }
];

class SelectOption extends Component {
  state = {
    selectedOption: []
  };

  handleSubmit = e => {
    e.preventDefault();
    const { getCurrentProfile, history } = this.props;
    const { value } = this.state.selectedOption;

    this.setState({ selectedOption: [] }, () =>
      getCurrentProfile(value, history)
    );
  };

  handleChange = selectedOption => this.setState({ selectedOption });

  render = () => (
    <div className="container">
      <form onSubmit={this.handleSubmit}>
        <Select
          value={this.state.selectedOption}
          onChange={this.handleChange}
          options={options}
        />
        <div className="save-button">
          <button type="submit" className="uk-button uk-button-primary">
            Save Preferences
          </button>
        </div>
        <div className="clear-button">
          <button
            type="button"
            onClick={this.props.clearCurrentProfile}
            className="uk-button uk-button-danger"
          >
            Reset Preferences
          </button>
        </div>
      </form>
    </div>
  );
}

export default connect(
  state => ({ profile: state.profile }),
  { clearCurrentProfile, getCurrentProfile }
)(withRouter(SelectOption));

SelectOption.propTypes = {
  clearCurrentProfile: PropTypes.func.isRequired,
  getCurrentProfile: PropTypes.func.isRequired,
  profile: PropTypes.shape({
    profile: PropTypes.arrayOf(PropTypes.object),
    profiles: PropTypes.arrayOf(PropTypes.object),
    loading: PropTypes.bool
  }).isRequired
};

答案 8 :(得分:5)

在获得所有这些很棒的答案之后,我希望我的答案能够找到人并帮助他们。我写了一个小服务来跟踪路线历史。在这里。

write.table

答案 9 :(得分: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的后退按钮,它会将用户重定向到不是您的网页的上一页。

答案 10 :(得分:3)

也许您想检查之前的历史记录点是否在您的应用中。例如,如果您直接进入您的应用并执行 location.back()(例如,通过按工具栏中的 <- back 按钮),您将返回浏览器的主页,而不是去其他地方在您的应用内

我是这样检查的:

import { Component } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Location } from '@angular/common';

@Component({
  selector: 'app-foo',
  template: ''
})
export class FooComponent {

  private readonly canGoBack: boolean;

  constructor(
    private readonly route: ActivatedRoute,
    private readonly router: Router,
    private readonly location: Location
  ) {
    // This is where the check is done. Make sure to do this
    // here in the constructor, otherwise `getCurrentNavigation()`
    // will return null. 
    this.canGoBack = !!(this.router.getCurrentNavigation()?.previousNavigation);
  }

  goBack(): void {
    if (this.canGoBack) {
      // We can safely go back to the previous location as
      // we know it's within our app.
      this.location.back();
    } else {
      // There's no previous navigation.
      // Here we decide where to go. For example, let's say the
      // upper level is the index page, so we go up one level.
      this.router.navigate(['..'], {relativeTo: this.route});
    }
  }

}

我们检查加载当前路线的导航是否有前一个兄弟。这必须在构造函数中完成,而导航过程仍处于活动状态。

这并非没有警告:

  • canGoBack 即使之前的位置实际上在我们的应用程序中,页面已刷新,也将为 false。
  • 用户可能希望通过点击浏览器的后退按钮“返回”到上一页(goBack() 出现的位置),但由于应用返回历史记录而不是推送新位置,因此用户会更进一步,可能会感到困惑。

答案 11 :(得分:2)

以角度4使用preserveQueryParams,例如:

url: /list?page=1

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

点击该链接后,您将被重定向edit/10?page=1,保留参数

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

答案 12 :(得分:1)

自测试版18开始:

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

答案 13 :(得分:1)

  

要在不刷新页面的情况下返回,我们可以在html中进行如下操作    javascript:history.back()

<a class="btn btn-danger" href="javascript:history.back()">Go Back</a>

答案 14 :(得分:1)

我使用这种方式:

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

@Component({
    selector: 'Back_page',
    template: `<button  (click)="onBack()">Back</button>`,
})
export class BackPageComponent {
  constructor(private location: Location) { }

  onBack() {
    this.location.back();// <-- go back to previous location
  }
}

答案 15 :(得分:0)

另一种解决方案

window.history.back();

答案 16 :(得分:0)

是的,您可以做到。将此代码写在您的打字稿组件上,即可享受!

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

@Component({
    selector: 'return_page',
    template: `<button mat-button (click)="onReturn()">Back</button>`,
})
export class ReturnPageComponent {
  constructor(private location: Location) { }

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