重新加载 Angular 应用程序时,始终转到根页面,忽略路由
When reloading an Angular app go always to the root page ignoring routing
我有一个简单的 Angular 应用程序,它使用 router
。
我的路由逻辑很简单
Routes = [
{ path: '', component: MyMainComponent },
{ path: 'error', component: ErrorComponent },
]
如果应用程序发生错误,逻辑将导航到 ErrorComponent,因此我在浏览器 url 上看到的是 http://localhost:4200/error
。
如果用户从此处重新加载应用程序(例如使用 CMD+R
),应用程序将返回到 错误 页面。有没有办法强制重新加载到 Main,即使我们重新加载指向现有路由路径的 url?
是设计的问题。
如果确实发生错误,您应该提供 angular 信息。
- 它可能是一个存储上次错误的服务,当执行导航时会检查该服务。因此,当页面刷新时,该服务将不包含任何内容,您可以导航到默认路由
- 或者您可以向
error
路由提供额外的查询参数,该参数将在导航结束时被删除,并且当用户刷新页面时它不会在 url 中。因此,查看此参数的唯一方法是在应用程序内部导航。
事实上,这些方法是相似的——不同之处在于您存储内部导航信息的方式。
不依赖于您选择的方法,为了将导航限制到特定路线,您可以使用 CanActivate guard https://angular.io/api/router/CanActivate
下面是我解决这个问题的方法。
1.) 将你的组件包裹在一个根组件中,像这样
Routes = [
{ path: '', component: HomeComponent, children:[
{ path: '', component: MyMainComponent },
{ path: 'error', component: ErrorComponent }
]
]
2.) 在 HomeComponent 的构造函数中,将最后导航的 url 存储在 localstroage 中。
constructor(private router: Router) {
this.router.events
.pipe(filter((rs): rs is NavigationEnd => rs instanceof NavigationEnd))
.subscribe(event => {
localStorage.setItem("lastUrl",event.url);
})
}
3.) 监听你的 AppModule 的构造函数(每次页面刷新后都会被触发),并检查路由器上次是否在某个页面上,然后重定向到您想要的页面。
public constructor(private router: Router) {
if(localStorage.getItem("lastUrl")=="/error")
{
localStorage.setItem("lastUrl",null);
this.router.navigate(['/']);
}
}
我有一个简单的 Angular 应用程序,它使用 router
。
我的路由逻辑很简单
Routes = [
{ path: '', component: MyMainComponent },
{ path: 'error', component: ErrorComponent },
]
如果应用程序发生错误,逻辑将导航到 ErrorComponent,因此我在浏览器 url 上看到的是 http://localhost:4200/error
。
如果用户从此处重新加载应用程序(例如使用 CMD+R
),应用程序将返回到 错误 页面。有没有办法强制重新加载到 Main,即使我们重新加载指向现有路由路径的 url?
是设计的问题。 如果确实发生错误,您应该提供 angular 信息。
- 它可能是一个存储上次错误的服务,当执行导航时会检查该服务。因此,当页面刷新时,该服务将不包含任何内容,您可以导航到默认路由
- 或者您可以向
error
路由提供额外的查询参数,该参数将在导航结束时被删除,并且当用户刷新页面时它不会在 url 中。因此,查看此参数的唯一方法是在应用程序内部导航。
事实上,这些方法是相似的——不同之处在于您存储内部导航信息的方式。
不依赖于您选择的方法,为了将导航限制到特定路线,您可以使用 CanActivate guard https://angular.io/api/router/CanActivate
下面是我解决这个问题的方法。
1.) 将你的组件包裹在一个根组件中,像这样
Routes = [
{ path: '', component: HomeComponent, children:[
{ path: '', component: MyMainComponent },
{ path: 'error', component: ErrorComponent }
]
]
2.) 在 HomeComponent 的构造函数中,将最后导航的 url 存储在 localstroage 中。
constructor(private router: Router) {
this.router.events
.pipe(filter((rs): rs is NavigationEnd => rs instanceof NavigationEnd))
.subscribe(event => {
localStorage.setItem("lastUrl",event.url);
})
}
3.) 监听你的 AppModule 的构造函数(每次页面刷新后都会被触发),并检查路由器上次是否在某个页面上,然后重定向到您想要的页面。
public constructor(private router: Router) {
if(localStorage.getItem("lastUrl")=="/error")
{
localStorage.setItem("lastUrl",null);
this.router.navigate(['/']);
}
}