Angular15 - canActivate 基于其他服务中 BehaviorSubject 中存储的值

问题描述 投票:0回答:2

我有

PermissionsService
存储用户的权限。这些是在用户成功验证过程后由
HttpClient
从API加载的(登录后我调用加载用户权限组的
getUserGroupsWithModelPermissions()
,然后我将这些权限汇总到
_resolvedUserPermissions
BehaviorSubject)

在我需要这些用户权限的每个组件中,我订阅了

resolvedUserPermissions$
,在接收到数据后,我使用其他方法(例如
resolveModelPermission()
,我从
subscribe
传递数据)从
ModelPermissionsService
做业务逻辑和它运作良好。

组件中的示例用法:

  ngOnInit() {
    this.$permissions = this.permissionsService.resolvedUserPermissions$.subscribe(data => {
      this.canSeeProducts = this.permissionsService.resolveModelPermission(data, 'Products', PermissionScope.Read);
    })
  }

权限服务:

export class ModelPermissionService {

  private _resolvedUserPermissions = new BehaviorSubject<ModelFieldPermissions[]>([]); 
  public resolvedUserPermissions$ = this._resolvedUserPermissions.asObservable();

  public getUserGroupsWithModelPermissions(): void {
    this.httpClient.get<ApiResponse<UserGroups[]>>(userEndpoint + '/me/permissions', httpOptions)
    .subscribe({
      next: data => {
        this._resolvedUserPermissions.next(this.sumUserPermissions(data.data));
      },
      error: err => {
        console.error(err);
      }
    })
  }

public resolveModelPermission(userPermissions: ModelFieldPermissions[], modelName: string, permissionScope: PermissionScope):boolean {
    if(userPermissions.length > 0){
      // DO LOGIC HERE
    }
    return false;
  }


}

现在我需要在router guard服务的canActivate方法中使用

resolvedUserPermissions$
的数据,但我不知道如何订阅这个
resolvedUserPermissions$

我需要这样的东西:

canActivate(){
    this.modelPermissionService.resolvedUserPermissions$.subscribe(data =>{
        return this.modelPermissionService.resolveModelPermission(data, 'modelName', scope)
    })
}

我找到的所有方法都使用 pipe+map 而不是订阅,但我没有权限数据。例子:

canActivate(){
    return this.getAccess()
}

getAccess(){
    this.permissionsService.resolvedUserPermissions$.pipe(
        map(data =>{
            //here data is empty, no logic to do, because no subscription?
        })
    )
}
angular rxjs angular-router behaviorsubject angular-guards
2个回答
1
投票

你试过这个吗?

canActivate(){
    return this.modelPermissionService.resolvedUserPermissions$.pipe(
         switchMap(data => this.modelPermissionService.resolveModelPermission(data, 'modelName', scope))
    )
}

0
投票

许可服务:

export class ModelPermissionService {

 getUserGroupsWithModelPermissions(): Observable<ModelFieldPermissions[]> {
    this.httpClient.get<ApiResponse<UserGroups[]>>('yourpath', httpOptions)
      .pipe(
        map(data => this.sumUserPermissions(data.data)),
        shareReplay(1), // probably you want to hold and re-use result from api
        tap(data=> concole.log(data)), // DEBUGGING
      );
  }

  resolveModelPermission(data, 'modelName', scope): Observable<boolean> {
    return this.getUserGroupsWithModelPermissions().pipe(
      map(data=> / your code to extract permission from user data /),
    )
  }
}

在解析器服务中:

canActivate() {
    return this.modelPermissionService.resolveModelPermission(data, 'modelName', scope)
      .pipe(
        take(1), // Observable must complete!
        tap(data=> concole.log(data)), // DEBUGGING
      ),
}
© www.soinside.com 2019 - 2024. All rights reserved.