关于 Angular 应用对浏览器 Back 按钮支持问题的讨论

简介: 关于 Angular 应用对浏览器 Back 按钮支持问题的讨论

需求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 方法。



image.png

image.png


Angular 中的 CanDeactivate Guard 可用于避免导航到与应用程序相同域的另一个页面。


当我们在浏览器地址栏输入一个新的 URL 地址时,我们得到一个新页面,这个 URL 保存在浏览器历史记录中。 使用这个历史记录,我们可以回退到以前浏览过的页面。


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


标准浏览器历史记录对 Angular 这种单页面应用不起作用。我们可以编写自己的服务,当用户在我们的 Angular 应用程序中更改路由时监听。新 Route 将被保存,当用户点击后退按钮时,我们给出最后保存的路由记录。


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

image.png



Spartacus 针对这个 navigationEnd 事件并没有特殊的处理:

image.png


看个具体的例子。


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')
  }
}


相关文章
|
5月前
|
存储 前端开发 API
浅谈 Angular 应用前端消息显示机制的一个实际需求
浅谈 Angular 应用前端消息显示机制的一个实际需求
|
2月前
|
缓存 前端开发 测试技术
Angular 与 Angular Universal 超厉害!实现服务器端渲染,开启高效开发与优质用户体验之旅!
【8月更文挑战第31天】在现代前端开发中,用户体验至关重要。Angular Universal 为 Angular 应用提供服务器端渲染(SSR)解决方案,显著提升性能和可访问性。本文介绍 SSR 的优势,包括更快的首屏加载时间、更好的 SEO 和更稳定的用户体验。接着详细讲解安装和配置 Angular Universal 的步骤,并提供优化 SSR 性能的方法,如延迟加载、缓存和预取技术。同时讨论了处理动态内容的策略,并介绍了测试和部署的最佳实践。通过遵循这些实践,可以确保应用高效稳定运行,提升用户体验。附带的示例代码展示了如何在服务器端和客户端处理数据。
23 0
|
Web App开发 存储 前端开发
使用 Chrome 开发者工具研究一个基于 Angular 开发的网站源代码
使用 Chrome 开发者工具研究一个基于 Angular 开发的网站源代码
|
11月前
|
数据采集 JavaScript 前端开发
Angular 服务器端渲染应用 re-hydration 过程详解
Angular 服务器端渲染应用 re-hydration 过程详解
|
存储 网络架构
关于 Angular 应用对浏览器 Back 按钮支持问题的讨论
关于 Angular 应用对浏览器 Back 按钮支持问题的讨论
|
网络架构
如何处理 Angular 单页面应用里的 a 标签,避免点击后重新加载整个应用
如何处理 Angular 单页面应用里的 a 标签,避免点击后重新加载整个应用
|
JavaScript 前端开发 API
Angular 应用如何回退到之前曾经浏览过的页面
Angular 应用如何回退到之前曾经浏览过的页面
使用 Angular Universal 进行服务器端渲染的防御性编程思路
使用 Angular Universal 进行服务器端渲染的防御性编程思路
|
JavaScript 前端开发 测试技术
关于 Angular 开发时对主流浏览器支持的话题
关于 Angular 开发时对主流浏览器支持的话题
|
Web App开发 测试技术 C++
Angular最新教程-第三节在谷歌浏览器中调试Angular
Angular最新教程-第三节在谷歌浏览器中调试Angular
683 0
Angular最新教程-第三节在谷歌浏览器中调试Angular