Angular4中ActivatedRoute和ActivatedRouteSnapshot有什么区别

What is the difference between ActivatedRoute and ActivatedRouteSnapshot in Angular4

Angular4中的ActivatedRouteSnapshotActivatedRoute有什么区别?我的理解是 ActivatedRouteSnapshotActivatedRoute 的 child,这意味着 ActivatedRoute 包含 ActivatedRouteSnapshot.

顺便说一下,我尝试 运行 Google 搜索这个问题的答案,但我没有找到任何可以理解的搜索结果。

谢谢!

由于 ActivatedRoute ActivatedRouteSnapshot 是一个不可变对象,表示 ActivatedRoute 的特定版本。它将所有与 ActivatedRoute 相同的属性公开为纯值,而 ActivatedRoute 将它们公开为可观察值。

执行中的注释如下:

export class ActivatedRoute {
  /** The current snapshot of this route */
  snapshot: ActivatedRouteSnapshot;

如果路由器重用一个组件并且不创建新的激活路由,您将有两个版本的 ActivatedRouteSnapshot 用于相同的 ActivatedRoute。假设您有以下路由配置:

path: /segment1/:id,
component: AComponent

现在您导航到:

/segment1/1

您将在 activatedRoute.snapshot.params.id 中将参数设置为 1

现在您导航到:

/segment1/2

您将在 activatedRoute.snapshot.params.id 中将参数设置为 2

您可以通过执行以下操作来查看它:

export class AComponent {
  constructor(r: ActivatedRoute) {    
    r.url.subscribe((u) => {
      console.log(r.snapshot.params.id);
    });

有两种方法可以从路由中获取参数。

1。快照(route.snapshot.paramMap.get)。在初始化时阅读。

如果在组件初始化期间只需要参数的初始值一次,请使用快照,并且不要期望 URL 在用户仍在同一组件上时更改。

  • 即如果在 product/2 路线上,他们到达 product/3 的唯一方法是返回产品搜索屏幕,然后单击产品详细信息(离开详细信息组件,然后重新打开它使用新的路由参数)

2。可观察的(route.paramMap.subscribe)。在初始化期间订阅它。

如果在用户仍在同一组件上时路由可能发生变化,则使用 Observable,因此不会再次调用组件的初始化,但当 URL 改变了。

  • 即如果在 product/2 路线上,并且您有一个“下一步”按钮可以转到下一个 ID 记录 product/3,因此用户没有 leave/re-open 组件而是 URL确实收到了一个新参数。

一般来说,如果您不确定,订阅是最安全的途径。

此处其他答案未强调的关键区别之一是 ActivatedRoute 可以注入组件,而 ActivatedRouteSnapshot 不能。

中所述,您可以通过注入 ActivatedRoute 在组件中访问 ActivatedRouteSnapshot,然后访问其 snapshot 属性,如下所示:

constructor(route: ActivatedRoute) { 
  let activatedRouteSnapshot = route.snapshot;
}

另一方面,尝试将 ActivatedRouteSnapshot 直接注入组件将导致如下错误:

ERROR Error: Uncaught (in promise): Error: StaticInjectorError(AppModule)[YourComponent -> ActivatedRouteSnapshot]: StaticInjectorError(Platform: core)[YourComponent -> ActivatedRouteSnapshot]: NullInjectorError: No provider for ActivatedRouteSnapshot!

另请参阅 ActivatedRoute and ActivatedRouteSnapshot

的文档