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
});
}
});
}