角度-仅在使用router.navigate()方法进行路由时才允许路由

时间:2018-10-05 10:00:26

标签: angular

我的要求是,如果用户从地址栏中手动更改浏览器URL,则阻止用户导航。只能通过有角度的app(router.navigate())进行路由。

我知道我们可以使用canActive属性实现路由保护。

canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

}

但是我不知道我可以使用ActivatedRouteSnapshot或RouterStateSnapshot的哪些属性来标识用户正在使用手动URL更改在应用程序内部进行导航。你能帮忙吗?

2 个答案:

答案 0 :(得分:0)

我认为使用ActivatedRouteSnapshot或任何其他类是不可能的。

我想对您的应用程序添加一个奇怪的行为,因为这也意味着您不希望用户能够刷新页面。如果您担心通过手动导航到组件而没有足够的数据来使其正常运行,则可以使用前面提到的防护措施。

希望有帮助

答案 1 :(得分:0)

我最近遇到了这个问题,我想我已经解决了它,或者至少对我有用。

canActivate(
  next: ActivatedRouteSnapshot,
  state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

  const nav = this.router.getCurrentNavigation();

  if (nav.id === 1 || nav.previousNavigation !== null) {
    this.router.navigate(['/somewhere']);
  } else {
    return true;
  }
}

导航对象的属性“ id”指示应用程序中用户浏览历史记录中的编号。因此 id === 1 表示用户是通过浏览器地址首次输入的,而不是通过 router.navigate()

重定向输入的

如果用户已经在浏览该应用程序,则我们必须检查是否存在先前注册的导航,并能够从他们的浏览位置进行控制。