【发布时间】:2017-07-12 22:56:02
【问题描述】:
有没有办法强制路由器导航到相同的路由,以便通过调用这个 canActivate 守卫两次来更新路由数据:
@Injectable()
export class LevelGuard implements CanActivate {
private user_query_: string;
private level_query_: string;
constructor(private router_: Router, private query_resolver_: QueryResolver) { };
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let user: string = route.params["user"];
let level: string = route.params["level"];
if (!user && !level) { //=> "/create"
this.query_resolver_.setQuery({ user: this.user_query_ || "none", level: this.level_query_ || "none" });
this.level_query_ = "";
this.user_query_ = "";
return true;
}
else if (user && !level) { //=> "/create/:user"
this.router_.navigate(["/create"]);
this.level_query_ = "none";
this.user_query_ = user;
return false;
}
else { //=> "/create/:user/:level"
this.router_.navigate(["/create"]);
this.level_query_ = level;
this.user_query_ = user;
return false;
}
};
}
如果路由已经是“/create”,那么当这个 canActivate 守卫重定向到“/create”时,它应该为“/create/:user”和“/create/:user/:level”做这件事,守卫不被称为第二次。有一个更复杂的路由方案来规避这个问题,但这会大大简化它。
编辑:解决此问题的一种方法是添加一个虚拟组件,导航到该虚拟组件,然后返回“/create”,但这会导致明显的转换并且组件不会被重用。
this.router_.navigate(["/redirect"]).then((nav) => {
this.router_.navigate(["/create"]);
});
【问题讨论】:
标签: angular