从 Angular 5.1 开始,现在可以通过使用onSameUrlNavigation
配置选项作为内置 Angular 路由器的一部分来完成。尽管从文档中看不明显,但设置和开始使用相当简单。
您需要做的第一件事是在您的选项中设置选项(app.routing.ts
如果您有一个或配置应用程序路由的文件)。
'reload'
onSameUrlNavigation或有两个可能的值false
。当路由器被要求导航到活动路由时,默认值不会false
导致任何事情发生。我们想将此值设置为reload
。值得注意的是reload
,它实际上并没有完成重新加载路由的工作,它只是重新触发了我们需要挂钩的路由器上的事件。
@NgModule({
imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})],
exports: [RouterModule],
})
要确定实际触发这些事件的时间,您需要runGuardsAndResolvers
在路由上指定配置选项。这可以取三个值...
paramsChange
- 仅在路由参数发生变化时触发,例如在 id/user/:id
发生变化的地方
paramsOrQueryParamsChange
- 当路由参数改变或查询参数改变时触发。例如,id
或limit
财产变化/user/:id/invites?limit=10
always
- 导航路线时始终触发
在这种情况下,我们希望始终指定。示例路线如下所示。
export const routes: Routes = [
{
path: 'invites',
component: InviteComponent,
children: [
{
path: '',
loadChildren: './pages/invites/invites.module#InvitesModule',
},
],
canActivate: [AuthenticationGuard],
runGuardsAndResolvers: 'always',
}
]
那是你配置的路由器。下一步是实际处理其中一个组件中的事件。您需要将路由器导入到您的组件中,然后挂钩到事件中。在这个例子中,我已经挂钩NavigationEnd
了一旦路由器完成从一个路由到下一个路由的导航就会触发的事件。由于我们配置应用程序的方式,即使您尝试导航到当前路线,它现在也会触发。
export class InviteComponent implements OnInit {
constructor(
// ... your declarations here
private router: Router,
) {
// subscribe to the router events
this.router.events.subscribe((e: any) => {
// If it is a NavigationEnd event re-initalise the component
if (e instanceof NavigationEnd) {
this.initialiseInvites();
}
});
}
initialiseInvites() {
// Set default values and re-fetch any data you need.
}
}
繁重的工作进入该initialiseInvites()
方法,在这里您将属性重置为其默认值并从服务中获取数据以使组件恢复到其初始状态。
您需要在单击或通过某种形式的刷新按钮刷新时希望能够重新加载的每个组件上重复此模式,确保将runGuardsAndResolvers
选项添加到路由文件中的每个路由。