Angular 4路由器:阻止直接浏览器导航

时间:2017-08-01 01:34:00

标签: angular angular-routing angular4-router

如何说服Angular 4路由器在我的应用中禁用直接浏览器导航?

我查看了路由器挂钩CanActivateCanDeactivate并实现了它们,但在使用直接浏览器导航时,CanDeactivate根本不会触发。

我可以使用CanActivate来阻止网址,但只有在应用重新启动后才能停止,这会花费时间并在浏览器窗口中进行不必要的更改。

我希望能够在应用重新启动之前捕获直接浏览器导航。

如果这有帮助: 我想完全不允许直接浏览器导航,因此我不需要允许某些网址并禁用其他网址的解决方案。

这是我的路由器定义:

const routes: Routes = [
  { path: '', redirectTo: '/dashboard', pathMatch: 'full' },
  { path: 'dashboard', component: DashboardComponent, canActivate: [RouteGuardService] },
  { path: 'users', component: UsersMainComponent, canActivate: [RouteGuardService] },
  { path: 'vendors', component: VendorMainComponent, canActivate: [RouteGuardService] },
  { path: 'invoices', component: InvoicesMainComponent, canActivate: [RouteGuardService] },
  { path: 'offers' , component: EsdMainComponent, canActivate: [RouteGuardService] },
  { path: 'settings' , component: SettingsMainComponent, canActivate: [RouteGuardService] },
  // Callback MUST not be route guard protected.
  { path: 'callback' , component: CallbackComponent },
  { path: 'createvendor' , component: CreateVendorsComponent, canActivate: [RouteGuardService] },
  { path: 'customerdashboard' , component: CustomerDashboardComponent, canActivate: [RouteGuardService] },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
  providers: [RouteGuardService]
})
export class AppRoutingModule { }

2 个答案:

答案 0 :(得分:6)

以下解决方案不是基于Angular的解决方案。正如Maximus在他的回答中解释的那样,这是一个浏览器问题,因此解决方案必须基于浏览器。

此解决方案源自此站点上的答案(see here)我使用以下三种方法编写了一些(打字稿)服务:

  private preventNavigation(): void {
    const location = window.document.location;
    const originalHashValue = location.hash;

    window.setTimeout(() => {
      location.hash = 'preventNavigation' + (9999 * Math.random());
      location.hash = originalHashValue;
    }, 0);
  }

  public disableBrowserNavigation(): void {
    window.addEventListener('beforeunload', this.preventNavigation, false);
    window.addEventListener('unload', this.preventNavigation, false);
  }

  public enableBrowserNavigation(): void {
    window.removeEventListener('beforeunload', this.preventNavigation);
    window.removeEventListener('unload', this.preventNavigation);
  }

这很好但我仍然愿意接受其他解决方案。

答案 1 :(得分:3)

  

如何说服Angular 4路由器禁用直接浏览器   在我的应用程序中导航?

Angular不能这样做,因为它不是Angular控制的东西。当您转到地址栏并输入地址,然后按Enter键浏览器将加载新页面。它可以是Angular应用程序,也可以是任何其他应用程序。它是一个浏览器功能。当您点击routerLink时,Angular控件仅在内部导航

您可以尝试使用onbeforeunload,但它有其局限性。