两者都很重要,因为您可能有不同的要求,用户可以访问根组件,但可能不满足子组件的条件。
示例:您可能会遇到这样的情况:用户必须经过身份验证才能导航到根组件,但必须具有权限“x”才能访问子组件。在这样的情况下,canActivateChild
无需添加即可节省大量打字时间canActivate
守护着每一个孩子。
EDIT:
例如,您可能有一个管理模块,其中所有路由都需要防止未经授权的进入:
{
path: 'admin',
component: AdminComponent,
canActivate: [ AuthGuardService ],
children : [
{
path: '', component: ...,
},
{
path: 'manage-users', component: ...,
},
{
path: 'manage-roles', component: ...,
}
]
}
这需要自上而下的保护。未经授权不得访问任何路由,包括根路由和子路由。在这个情况下canActivate
从根本上来说,它可以很好地保护一切。
但有时您也可能有一个功能模块,其中只需要保护某些子项:
{
path: 'featureA',
component: ...,
canActivateChild: [ AuthGuardService ],
children : [
{
path: 'manage-feature', component: ...,
},
{
path: 'manage-members', component: ...,
}
],
{path: 'featureB', component: ...}
}
在这种情况下,也许所有用户都需要访问根组件“featureA”和“featureB”,但只有某些用户需要能够导航到“featureA”的子路由。在这种情况下,更容易在根级别使用一个防护来保护子级,而不是根本身。另一种方法是把canActivate
每条儿童路线都有警卫,这可能会很乏味。
这实际上完全取决于您的要求,但同时拥有这两种选择可能会很好canActivate
and canActivateChild
.