我的authService中有这段代码
constructor(
private afAuth: AngularFireAuth,
private db: AngularFireDatabase,
private router: Router
) {
this.authState = afAuth.authState;
this.authState.subscribe((user: firebase.User) => {
this.authState = user;
});
if ( this.authenticated ) {
// this.router.navigate([`/content`]);
}
}
// Returns true if user is logged in
get authenticated(): any {
return this.authState;
}
我调用get authenticated
并返回undefined:
COMPONENT
constructor(
private auth: AuthService
) {
this.currentUser = this.auth.authenticated;
}
showUser() {
console.log(this.currentUser.uid);
}
我需要帮助解决它,任何想法?
答案 0 :(得分:0)
你的目的是什么?你需要什么以及为什么?
我仍然不知道你为什么需要这样的东西。但我认为它是生命周期钩子的问题(you can find here the doc)。
试试这样。这是你的组件
export class *YOUR_COMPONENT* implements OnInit {
private authenticatedUser$: Subscription; <= import rxjs/Subscription
private authenticatedUser: User; <= import firebase/app
constructor(private auth: AuthService) {
this.authenticatedUser$ = this.auth.getAuthenticatedUser().subscribe((user: User) => {
// Here you're saving the firebase.user in your var authenticatedUser
this.authenticatedUser = user;
});
ngOnInit() {
// Check if user is logged in..
if(this.authenticatedUser) {
// When true, your code here..
}
}
....}
在这里你的authService:
export class authService {
constructor(private afAuth: AngularFireAuth) { <= import angularfire2/auth/auth
// constructor is empty
});
getAuthenticatedUser() {
return this.auth.authState;
}
....}
这应该有用..
答案 1 :(得分:0)
发生的事情是正常的。 console.log
是同步调用。订阅中的内容是异步的。所以即使{。1}}是在.subcribe之后写的,也可以更快地执行。这就是console.log
打印console.log( this.authState.uid );
。
另外,我会避免在undefined
中添加任何逻辑。
最好使用.subscribe contructor
并尝试访问OnInit()
生命周期中的this. authState
。
最后请注意,您甚至可以保存订阅AfterViewInit()
和OnInit
.unsubscribe
:)
答案 2 :(得分:0)
AngularFireAuth.authState
是异步和Observable
。 You can read up on what an Observable is here on the ReativeX site
在sort中,authState observable是一段随时间变化的值,aysnc(需要一些时间来解析)和lazy(你需要订阅才能得到一个值,这就是你的console.log外部不起作用的原因。 )
如果您需要访问&#34;当前&#34;订阅块之外的值我建议使用BehaviorSubject
(again check out ReactiveX for more information on subjects):
currentAuthState: BehaviorSubject<firebase.User|null|undefined>;
constructor(afAuth: AngularFireAuth) {
this.currentAuthState = new BehaviorSubject(undefined);
afAuth.authState.subscribe(this.currentAuthState);
}
然后您可以访问:this.currentAuthState.getValue()
以查看当前值是什么; .subscribe
倾听变化;使用任何其他RxJS运算符,如map,do,swtichMap等;并在视图{{ (currentAuthState | async)?.email }}
加载时为undefined
,如果没有用户登录则为null
,如果用户已登录则为firebase.User
。