Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular Can';无法从authService的某个方法访问其公共属性_Angular_Typescript_Firebase_Firebase Authentication - Fatal编程技术网

Angular Can';无法从authService的某个方法访问其公共属性

Angular Can';无法从authService的某个方法访问其公共属性,angular,typescript,firebase,firebase-authentication,Angular,Typescript,Firebase,Firebase Authentication,我正在创建一个angular auth服务。 我有一个带有公共变量的服务(我需要公共变量,因为我在许多组件中使用它),它是登录用户,我想在登录/注销后更新这个变量 @Injectable() export class AuthService implements OnInit{ public loggedUser: firebase.User; constructor(private firebaseAuth: AngularFireAuth) { this.loggedUse

我正在创建一个angular auth服务。 我有一个带有公共变量的服务(我需要公共变量,因为我在许多组件中使用它),它是登录用户,我想在登录/注销后更新这个变量

@Injectable()
export class AuthService implements OnInit{
  public loggedUser: firebase.User;

  constructor(private firebaseAuth: AngularFireAuth) {
    this.loggedUser = firebase.auth().currentUser;
  } ....
我拥有服务中的所有功能:

signup(email: string, password: string) {
    this.firebaseAuth
      .auth
      .createUserWithEmailAndPassword(email, password)
      .then(value => {
        console.log('Success!', value);
        this.loggedUser = firebase.auth().currentUser;
      })
      .catch(err => {
        console.warn('Something went wrong:',err.message);
      });    
  }

  login(email: string, password: string) {
    this.firebaseAuth
      .auth
      .signInWithEmailAndPassword(email, password)
      .then(value => {
        console.log('Nice, it worked!');
        this.loggedUser = firebase.auth().currentUser;
      })
      .catch(err => {
        console.warn('Something went wrong:',err.message);
      });
  }
他们工作顺利。但使用facebook auth:

facebooklogin(){
    var provider = new firebase.auth.FacebookAuthProvider();
    this.firebaseAuth
    .auth
    .signInWithPopup(provider).then(function(result) {
      // This gives you a Facebook Access Token. You can use it to access the Facebook API.
      var token = (<any> result).credential.accessToken;
      // The signed-in user info.
      var userResult = result.user;
      this.loggedUser = firebase.auth().currentUser;
      console.log(userResult,token)
    }).catch(function(error) {
      // Handle Errors here.
      var errorCode = error.code;
      var errorMessage = error.message;
      // The email of the user's account used.
      var email = error.email;
      // The firebase.auth.AuthCredential type that was used.
      var credential = error.credential;
      // ...
      console.warn(errorCode,errorMessage,email,credential)
    });
  }
facebook登录(){
var provider=new firebase.auth.FacebookAuthProvider();
这是firebaseAuth
作者
.signInWithPopup(提供程序)。然后(函数(结果){
//这将为您提供一个Facebook访问令牌。您可以使用它访问Facebook API。
var token=(结果).credential.accessToken;
//已登录的用户信息。
var userResult=result.user;
this.loggedUser=firebase.auth().currentUser;
日志(userResult,令牌)
}).catch(函数(错误){
//在这里处理错误。
var errorCode=error.code;
var errorMessage=error.message;
//使用的用户帐户的电子邮件。
var email=error.email;
//使用的firebase.auth.AuthCredential类型。
var-credential=error.credential;
// ...
控制台警告(错误代码、错误消息、电子邮件、凭证)
});
}

将currentUser分配给loggedUser时出错:“无法设置未定义的属性'loggedUser'。所以这就好像它没有被认出来。如果我将console.log记录到这一点,事实上我会得到未定义的结果。这是怎么回事?

您应该为此使用一个箭头函数,与前两个函数类似

facebooklogin(){
    var provider = new firebase.auth.FacebookAuthProvider();
    this.firebaseAuth
    .auth
    .signInWithPopup(provider).then(result => {

    }).catch(error =>{

    });
  }
或者,如果您希望以相同的方式执行,请首先在回调外部定义一个变量self,然后在回调内部引用self

facebooklogin(){
    var self = this
    var provider = new firebase.auth.FacebookAuthProvider();
    this.firebaseAuth
    .auth
    .signInWithPopup(provider).then(function(result) {
           //self.loggedin
    }).catch(function(error) {

    });
  }