Angular 2 功能不一致 运行
Angular 2 function not running consistently
组件:
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");
}
}
基本上,如果用户已登录,该功能会将用户重定向到仪表板视图。当通过另一个视图访问视图(应用程序登录)时,它工作得很好,但如果您要通过键入url,该函数不执行重定向,而是记录 "not logged in"。
首先,正如 firebase 文档中提到的那样:can view it here
Note: currentUser might also be null because the auth object has not finished initializing. If you use an observer to keep track of the user's sign-in status, you don't need to handle this case.
所以这就是解释你的问题并解释为什么你的 setTimeout
解决了这个问题,因为它 return 是一个可观察的。
其次,根据您在上面写下的语法,我假设您不使用 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");
}
}
});
只需根据您的代码进行调整,尽情享受吧:)
组件:
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");
}
}
基本上,如果用户已登录,该功能会将用户重定向到仪表板视图。当通过另一个视图访问视图(应用程序登录)时,它工作得很好,但如果您要通过键入url,该函数不执行重定向,而是记录 "not logged in"。
首先,正如 firebase 文档中提到的那样:can view it here
Note: currentUser might also be null because the auth object has not finished initializing. If you use an observer to keep track of the user's sign-in status, you don't need to handle this case.
所以这就是解释你的问题并解释为什么你的 setTimeout
解决了这个问题,因为它 return 是一个可观察的。
其次,根据您在上面写下的语法,我假设您不使用 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");
}
}
});
只需根据您的代码进行调整,尽情享受吧:)