Angular4中ActivatedRoute和ActivatedRouteSnapshot有什么区别
What is the difference between ActivatedRoute and ActivatedRouteSnapshot in Angular4
Angular4中的ActivatedRouteSnapshot
和ActivatedRoute
有什么区别?我的理解是 ActivatedRouteSnapshot
是 ActivatedRoute
的 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
的文档
Angular4中的ActivatedRouteSnapshot
和ActivatedRoute
有什么区别?我的理解是 ActivatedRouteSnapshot
是 ActivatedRoute
的 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
的文档