Угловой 6: передача isAdmin? значение из метода AuthService в метод AutAGtivard () - PullRequest
0 голосов
/ 28 августа 2018

Угловое приложение 6 & Firestore.

Я пытаюсь создать службу AuthGuard с методом canActivate(), который возвращает логическое значение. Логическое значение основано на свойстве UserAuthService, которое называется isAdmin.

Проблема в том, что canActivate() выполняется до того, как мой UserAuthService успеет присвоить значение свойству isAdmin. Поэтому isAdmin возвращается как undefined.

Я пытался использовать subscribe и .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
            });
          }
      });
   }
...