组件:
import { Component, OnInit } from '@angular/core';
import { AF } from "../angularfire.service";
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.less']
})
export class LoginComponent implements OnInit {
constructor(private afService: AF) { }
ngOnInit() {
this.afService.checkUser();
}
}
服务内部的功能:
checkUser() {
var user = firebase.auth().currentUser;
if (user) {
this.router.navigate(['/dashboard']);
} else {
console.log("not logged in");
}
}
基本上,如果用户登录,该功能会将用户重定向到仪表板视图。当通过其他视图访问视图(app-login)时效果很好,但是如果要通过键入URL来访问视图,该功能不会执行重定向,而是记录"未登录"。
答案 0 :(得分:1)
首先,正如firebase文档中提到的那样:can view it here
注意:currentUser也可能为null,因为auth对象尚未完成初始化。如果您使用观察者来跟踪用户的登录状态,则无需处理此情况。
这样就可以解释您的问题并解释为什么您的setTimeout
会解决这个问题,因为它会返回一个可观察的内容。
第二,根据你上面写的语法,我假设你没有使用AngularFire2
服务(只是缺乏服务描述),所以我建议你使用AngularFire2
因为它更简单,并提供简单的API与angularfire-database
进行通信
我可以使用AngularFire2
建议以下解决方案:
组件:
//basically the same.
服务:
import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';
import { AngularFire, AuthProviders, AuthMethods } from 'angularfire2';
import 'rxjs/Rx' ;
import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/first';
constructor(public af: AngularFire){}
checkUser() {
this.af.auth.first().toPromise().then(user => {
if (user) {
this.router.navigate(['/dashboard']);
} else {
console.log("not logged in");
}
}
});
只需将其调整为您的代码,然后享受:)