需要1:如果开发人员想禁用整个应用程序或多个组件的后退按钮
需要2:如果只想禁用特定组件的后退按钮

对于第一个要求,一个可行的方法是,实现一个 Guard 并将其利用于所需的路由。

示例代码:

import { LocationStrategy } from '@angular/common';@Component({  selector: 'app-root'})export class AppComponent {  constructor(    private location: LocationStrategy  ) {    history.pushState(null, null, window.location.href);    // check if back or forward button is pressed.    this.location.onPopState(() => {        history.pushState(null, null, window.location.href);        this.stepper.previous();    });  }}

Spartacus 我的项目里 RoutingService 的 back 办法实现。Visual Studio Code 的 peek reference 性能显示,没有其余代码调用了这个 back 办法。

Angular 中的 CanDeactivate Guard 可用于防止导航到与应用程序雷同域的另一个页面

当咱们在浏览器地址栏输出一个新的 URL 地址时,咱们失去一个新页面,这个 URL 保留在浏览器历史记录中。 应用这个历史记录,咱们能够回退到以前浏览过的页面。

像 Angular 这样的 SPA 应用程序呢? 大多数状况下,在 Angular 中咱们有一个动态路由,但咱们会更改当前页面上的外部组件。

规范浏览器历史记录对 Angular 这种单页面利用不起作用。咱们能够编写本人的服务,当用户在咱们的 Angular 应用程序中更改路由时监听。新 Route 将被保留,当用户点击后退按钮时,咱们给出最初保留的路由记录。

在咱们存储路线历史的导航服务中,咱们订阅了 Route 更改事件。 咱们将每条新路线保留在一个数组中。 显然,这个服务蕴含了一个获取之前路由并返回的办法。

Spartacus 针对这个 navigationEnd 事件并没有非凡的解决:

看个具体的例子。

UserListComponent 应该蕴含所有用户的列表,而 ActiveUsersComponent 只蕴含局部用户。 这两个组件都将链接到 UserDetailComponent,而后咱们心愿从该组件导航回来。

const routes: Routes = [  {    path: 'users',    component: UsersComponent,    children: [      { path: '', component: UserListComponent },      { path: 'active', component: ActiveUsersComponent },      { path: ':id', component: UserDetailComponent },    ],  },  { path: '**', redirectTo: 'users' },]

动态路由

一种解决方案是在详细信息组件中定义路由器链接,并应用相对路由显式导航回父级:

<a routerLink="/users">Back with Absolute Routing</a>

或者,也能够从组件类以编程形式执行此操作,但请记住,router links 比通过点击事件触发的导航从语义上来说更清晰。

import { Router } from '@angular/router'@Component({...})export class UserDetailComponent {  constructor(private router: Router) {}  back(): void {    this.router.navigate('/users')  }}