从 Angular 5.1 开始,现在可以使用 onSameUrlNavigation 来完成此操作
配置选项作为内置 Angular 路由器的一部分。尽管从文档中看不明显,但设置和开始使用相当简单。
您需要做的第一件事是在您的app.routing.ts 中设置选项(如果您有一个或配置应用路由的文件)。
onSameUrlNavigation 'reload' 或 false 有两个可能的值。默认值为false,当路由器被要求导航到活动路由时,不会发生任何事情。我们想将此值设置为reload。值得注意的是reload实际上并没有做重新加载路由的工作,它只是重新触发路由器上的事件,然后我们需要挂钩。
@NgModule({
imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})],
exports: [RouterModule],
})
要确定实际触发这些事件的时间,您需要在路由中指定 runGuardsAndResolvers 配置选项。这可以取三个值...
paramsChange - 仅在路由参数发生变化时触发,例如/user/:id 中的 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 选项添加到路由文件中的每个路由。