Угловое приложение 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
});
}
});
}