Angular Routing文档提到了组件实例创建,组件实例激活和路由激活 .
文档没有解释这些概念的差异,以及何时发生每个创建/激活 .
问题
-
实例创建和实例激活有什么区别?
-
实例激活和路由激活有什么区别?
-
实例激活是否始终与实例创建同时发生?
In summary :目前尚不清楚组件实例激活和路由激活的真正含义,以及它与组件实例创建的关系(特别是时序方面) .
已知信息
Instance Creation
-
在不同类型的组件之间导航时,Angular会创建组件实例
-
在同一组件的实例之间导航时,默认情况下会重复使用这些实例
Instance Activation
-
当浏览器的位置URL更改为与路径段(例如/ crisis-center)匹配时,路由器激活相应组件的实例(例如CrisisListComponent)并显示其视图
-
当应用程序请求导航到路径(例如/ crisis-center)时,路由器激活相应组件的实例(例如CrisisListComponent),显示其视图,并使用该路径的URL更新浏览器的地址位置和历史记录
Route Activation
- 在整个文档中提到了一些地方 . 见下文
Angular Doc References
以下是Angular文档中对上述三个概念的一些提及:
Instance Creation
默认情况下,路由器在重新导航到相同的组件类型时重新使用组件实例,而不首先访问其他组件 . ...此应用程序不会重复使用HeroDetailComponent . 用户始终返回到英雄列表以选择要查看的另一个英雄 . 没有访问其间的列表组件,无法从一个英雄细节导航到另一个英雄细节 . 因此,路由器每次都会创建一个新的HeroDetailComponent实例 .
Instance Activation
当浏览器的位置URL更改为与路径段/危机中心匹配时,路由器将激活CrisisListComponent的实例并显示其视图 .
当应用程序请求导航到路径/危机中心时,路由器会激活CrisisListComponent的实例,显示其视图,并使用该路径的URL更新浏览器的地址位置和历史记录 .
Route Activation
第三条路径中的data属性是存储与此特定路径关联的任意数据的位置 . 可以在每个激活的路径中访问data属性 .
您还可以使用CanActivateChild防护保护子路线 . CanActivateChild后卫与CanActivate后卫相似 . 关键的区别在于它在任何子路由被激活之前运行 .
在英雄细节和危机细节中,应用程序等待直到路线被激活以获取相应的英雄或危机 .
ActivatedRouteSnapshot包含将要激活的未来路由,如果您通过了防护检查,则RouterStateSnapshot包含应用程序的未来RouterState .
1 回答
实例化意味着创建路由(ActivateRoute)或组件的实例 . 激活路由意味着将其附加到router-outlet指令 . 激活组件意味着将其附加到DOM . 使用router-outlet指令的activateWith功能激活路由和组件 .
我们来看一些例子 . 假设您有以下路线:
Now you navigate to a/b.
路由器将:
实例化
{ path: 'a', component: AComponent, children: [] }
路线实例化
{ path: 'b', component: BComponent }
路线通过将这些路线附加到相应的
router-outlet
位置来激活这些路线使用this approach实例化
AComponent
和BComponent
通过将它们添加到DOM来激活
AComponent
和BComponent
Now you navigate to a/n1.
路由器将:
重用路由
a
-{ path: 'a', component: AComponent, children: [] }
route(无实例化或激活)实例化
{ path: ':name', component: DComponent }
路线激活
{ path: ':name', component: DComponent }
路线重用
AComponent
实例(无实例化或激活)实例化
DComponent
实例激活
DComponent
,将其附加到AComponent
视图中的router-outlet
Now you navigate to a/n2.
路由器将:
重用路由
a
-{ path: 'a', component: AComponent, children: [] }
route(无实例化或激活)重用路由
n2
-{ path: ':name', component: DComponent }
route(无实例化或激活)更新
n2
激活路线的参数重用
DComponent
实例(无实例化或激活)