2

Angular 6 和 Firestore 应用程序。

我正在尝试使用返回布尔值AuthGuard的方法构建服务。canActivate()布尔值基于一个UserAuthService名为 的属性isAdmin

问题是canActivate()在我UserAuthService有时间为属性赋值之前执行isAdmin。因此isAdmin返回为undefined

我尝试过使用subscribeand .map.pipe(map => ())但都无济于事。我知道我做错了什么,但我无法确定是什么。

有没有办法强制canActivate()等到isAdmin被赋值?

这是代码。

// app.routing.ts

import { AuthGuardService as AuthGuard } from './auth-guard.service';

const appRoutes: Routes = [
  {
    path: 'admin',
    component: AdminComponent,
    canActivate: [AuthGuard]
  }
]

AuthGuard服务:

// auth-guard.service.ts

export class AuthGuardService implements CanActivate {

    constructor(public userauth: UserAuthService,
                public router: Router) {}

    canActivate(): boolean {
      if (this.userauth.isAdmin === true) {
        return true;
      } else {
        this.router.navigate(['login']);
        return false;
      }
    }
}

UserAuthService

// user-auth.service.ts

export class UserAuthService {
  usersCollection: AngularFirestoreCollection<User>;
  user: Observable<firebase.User>;
  isAdmin: boolean;

  constructor(private afAuth: AngularFireAuth,
              private afs: AngularFirestore) {
      this.usersCollection = this.afs.collection('users');
      this.user = afAuth.authState;

      this.user.subscribe(user => {
          if (user === null) {
            this.isAdmin = false;
          } else {                
            this.usersCollection.doc(`${user.uid}`).ref.get().then((doc) => {
              this.isAdmin = doc.data().admin; <-- THIS.ISADMIN ASSIGNED VALUE HERE
            });
          }
      });
   }
4

0 回答 0