首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在加载页面前将数据保存在防护中吗

我可以在加载页面前将数据保存在防护中吗
EN

Stack Overflow用户
提问于 2018-01-06 01:58:57
回答 1查看 60关注 0票数 1

当前路由配置:

代码语言:javascript
复制
  //...
  {
    path: 'foo/:id',
    component: SomeComponent,
    canActivate: [SomeGuard]
  },
  //...

然后,我调用权限服务来获取组件的访问权限:

代码语言:javascript
复制
@Injectable()
export class SomeGuard implements CanActivate {

  constructor(private service: Service) {
  }

  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    const id = parseInt(next.params['id']);

    return this.service.getPermissions(id).then(permissions => {
      if (permissions.canView) {
        return true;
      }
      return false;
    });
  }
}

但在组件中,我使用了相同的权限端点,这意味着我连续调用它两次才能转到一个页面:

代码语言:javascript
复制
 //...
  constructor(private route: ActivatedRoute,
              private service: Service) {
  }


  ngOnInit() {
    this.id = parseInt(this.route.snapshot.params['id']);

    this.service.getPermissions(this.id).then(permissions => {
        // ...
    });
  }
  //...

因此,最好只将权限数据保存在路由中,并由guard和组件使用它。我试过使用resolve,但发现resolve只有在守卫之后才会激活,这并不好。那么如何保存权限数据呢?

EN

回答 1

Stack Overflow用户

发布于 2018-01-06 02:57:04

编辑:因为您每次都需要加载权限,所以您可以侦听RouteNavigationStart并清除缓存。如果这变得太麻烦,无法在PermissionsService中维护,您可以将逻辑提取到单独的服务中。

您可以在用于获取权限的服务中执行以下操作:

代码语言:javascript
复制
// Permissions service
private permissionCache;

constructor(
    router: Router,
) {
    // clear cache when a route navigation starts
    router.events
        .filter(event => event instanceof NavigationStart)
        .subscribe(event => this.permissionCache = {})
}

getPermissions(id) {
    if (permissionCache[id]) {
        return Observable.of(permissionCache[id]);
    } else {
        // get the permissions
        permissionCache[id] = response;
        return Observable.of(response);
    }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48118913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档