Angular 6 和 Firestore 应用程序。
我正在尝试使用返回布尔值AuthGuard
的方法构建服务。canActivate()
布尔值基于一个UserAuthService
名为 的属性isAdmin
。
问题是canActivate()
在我UserAuthService
有时间为属性赋值之前执行isAdmin
。因此isAdmin
返回为undefined
。
我尝试过使用subscribe
and .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
});
}
});
}