Angular2将数据从CanActivate保护传递到Resolve解析器?

Slo*_*oem 12 angular2-routing angular

我有一种情况,我一直在使用Resolve在导航到组件之前通过HTTP调用从远程源预加载一些数据.现在我需要实现一些保护逻辑,这需要根据某些条件预先加载数据以验证当前用户的某些字段.

我想避免向CanActivate守卫中的后端发出完全相同的请求,然后立即向后卫发出相同的请求Resolve.

有没有什么方法可以从CanActivate路径配置或路由配置中访问路由数据来临时覆盖解析器,只是设置数据对象的值,因为我已经得到了我要请求的内容?

我试着逃避一些简单的事情

route.data['myData'] = value;
Run Code Online (Sandbox Code Playgroud)

但这是一个错误,因为"对象不可扩展".

我也试过类似的东西:

this.router.routerState.root.data['myData'] = value;
Run Code Online (Sandbox Code Playgroud)

哪个没有产生任何错误,但是数据没有存活到方法的route.data元素中Resolve.resolve().

我想避免像定制或hacky这样的东西,就像临时将对象存储在服务上一样,就像某种缓存一样.是否有任何标准机制在内部路由器元素之间传输数据以支持高级预取和数据所有权检查等内容?

编辑 如果将路由器注入到Resolve类的构造函数中,并且以相同的方式访问它,则routerState可以正常工作.但这需要在之后清除,否则它会在导航呼叫之间保持不变.

Noé*_*aün 8

dataan的属性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;
  }
}
Run Code Online (Sandbox Code Playgroud)

并在您的解析器中访问它

@Injectable()
export class FooResolver implements Resolve<any> {

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

}
Run Code Online (Sandbox Code Playgroud)