首页 文章

角度路由:实例创建与实例激活

提问于
浏览
4

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实例 .

Link

Instance Activation

当浏览器的位置URL更改为与路径段/危机中心匹配时,路由器将激活CrisisListComponent的实例并显示其视图 .

Link

当应用程序请求导航到路径/危机中心时,路由器会激活CrisisListComponent的实例,显示其视图,并使用该路径的URL更新浏览器的地址位置和历史记录 .

Link

Route Activation

第三条路径中的data属性是存储与此特定路径关联的任意数据的位置 . 可以在每个激活的路径中访问data属性 .

Link

您还可以使用CanActivateChild防护保护子路线 . CanActivateChild后卫与CanActivate后卫相似 . 关键的区别在于它在任何子路由被激活之前运行 .

Link

在英雄细节和危机细节中,应用程序等待直到路线被激活以获取相应的英雄或危机 .

Link

ActivatedRouteSnapshot包含将要激活的未来路由,如果您通过了防护检查,则RouterStateSnapshot包含应用程序的未来RouterState .

Link

1 回答

  • 5

    实例创建和实例激活之间有什么区别?

    实例化意味着创建路由(ActivateRoute)或组件的实例 . 激活路由意味着将其附加到router-outlet指令 . 激活组件意味着将其附加到DOM . 使用router-outlet指令的activateWith功能激活路由和组件 .

    我们来看一些例子 . 假设您有以下路线:

    {
        path: 'a',
        component: AComponent,
        children: [
            { path: 'b', component: BComponent },
            { path: ':name', component: DComponent }
        ]
    }
    

    Now you navigate to a/b.

    路由器将:

    • 实例化 { path: 'a', component: AComponent, children: [] } 路线

    • 实例化 { path: 'b', component: BComponent } 路线

    • 通过将这些路线附加到相应的 router-outlet 位置来激活这些路线

    • 使用this approach实例化 AComponentBComponent

    • 通过将它们添加到DOM来激活 AComponentBComponent

    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 实例(无实例化或激活)

相关问题