繁体   English   中英

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

[英]Angular2 pass data from CanActivate guard to Resolve resolver?

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

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

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

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

route.data['myData'] = value;

但这是一个错误,因为“对象不可扩展”。

我也试过类似的东西:

this.router.routerState.root.data['myData'] = value;

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

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

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

ActivatedRouteSnapshot的属性data是不可变的,这就是您收到错误的原因:

对象不可扩展

但你可以像这样替换整个对象:

@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;
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM