Angular2如何在Guard中获取目标URL?

时间:2016-09-12 13:16:35

标签: angularjs angular angularjs-directive angular2-routing angular2-template

我正在尝试创建一个CanDeactivate防护,以提示"保存更改"导航离开路线时的用户。我想排除一些路线(假设当用户切换标签但不选择新项目时)。我一直在努力理解如何在不使用某种导航服务的情况下获取目标网址,并保留完整的URL。这是我的签名可以停用

 // This is what handles the deactivate
public canDeactivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {

所有&#39;路线&#39;并且&#39;州&#39; object包含以前的URL,没有关于目标URL的信息。

我使用

触发另一个组件中的导航
this._router.navigate(['/clients', this.selectedClient.id, page]);

2 个答案:

答案 0 :(得分:4)

实际上目标状态是CanDeactivate的参数之一。

canDeactivate(
    component: CanComponentDeactivate,
    route: ActivatedRouteSnapshot,
    currentState: RouterStateSnapshot,
    nextState: RouterStateSnapshot
    ):  Observable<boolean>|Promise<boolean>|boolean {

    return true;
}

参考:https://angular.io/api/router/CanDeactivate

答案 1 :(得分:3)

您可以订阅路由器的活动:

NavigationStart应在CanDeactivate之前触发,因此您可以抓住目的地。

routingDestination: string = "";
constructor(router:Router) {
  router
    .events
    .filter(e:Event => e instanceof NavigationStart)
    .subscribe((e: NavigationStart) => this.routingDestination = e.url)
  }
}

除此之外,我认为需要知道CanDeactivate中的目的地是一种设计缺陷。但由于我不了解您的应用,这实际上可能是正确的方式。