我遇到过这样的情况:在导航到组件之前,我一直在使用resolve通过http调用从远程源预加载一些数据。现在我需要实现一些保护逻辑,这需要根据某些条件预先加载数据,以针对当前用户验证其中的某些字段。
我想避免在CanActivate保护程序中对后端发出完全相同的请求,然后立即在Resolve保护程序中发出同样的请求。
有什么方法可以从CanActivate或路由配置中访问路由数据,以便临时覆盖解析器并在数据对象上设置值,因为我已经得到了要请求的内容吗?
我试着逃避一些简单的事情

route.data['myData'] = value;

但这是一个错误,因为“对象不可扩展”。
我也试过类似的方法:
this.router.routerState.root.data['myData'] = value;

它没有产生任何错误,但是数据没有保存到route.data方法的Resolve.resolve()元素中。
我想避免一些过于定制或黑客的东西,比如在服务上临时存储对象,比如某种缓存。在内部路由器元素之间传输数据是否有支持高级预取和数据所有权检查之类的标准机制?
编辑
如果您将路由器注入Resolve类的构造函数中,并以相同的方式访问它,那么routerstate确实可以工作。但这需要在以后清除,否则它会在导航调用之间持续存在。

最佳答案

data的属性ActivatedRouteSnapshot是不可变的,这就是接收错误的原因:
对象不可扩展
但是你可以替换整个对象,比如:

@Injectable()
export class MyGuard implements CanActivate {
  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

    // Use the spread operator to keep the previously resolved data
    next.data = {...next.data, guardedData: 'guarded'};
    return true;
  }
}

在解析程序中访问它
@Injectable()
export class FooResolver implements Resolve<any> {

  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<any>|Promise<any>|any {
    return route.data.guardedData;
  }

}

关于angular - Angular2将数据从CanActivate防护传递到解析程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44053658/

10-09 17:50
查看更多