Angular 2功能不能始终如一地运行

时间:2017-06-11 08:48:39

标签: angular angular2-routing angularfire2

组件:

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来访问视图,该功能不会执行重定向,而是记录"未登录"。

1 个答案:

答案 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");
   }
  }
 });

只需将其调整为您的代码,然后享受:)