0

私はAngular2でFirebaseと遊んでいて、約束しているのはthisです。FirebaseでアクセスするAngular2約束

ここに私のスクリプトです。コンテキストの理解のために:ログイン時に、このユーザーに関連するデータベースの基本データがまだ最新であることを確認したい。

import { Injectable, Inject } from '@angular/core'; 
import { AngularFire, AuthProviders, FirebaseAuthState, FirebaseApp } from 'angularfire2'; 

@Injectable() 
export class AuthService { 
    user; 
    userUID; 
    userEmail; 
    isAuthenticated: boolean = false; 

constructor(public af: AngularFire, @Inject(FirebaseApp) firebaseApp: firebase.app.App) { 
    this.af.auth.subscribe(authState => { 
     if (authState && !authState.auth.isAnonymous) { 
     this.user = authState; 
     this.isAuthenticated = true; 
     this.userEmail = this.user.auth.email; 
     this.userUID = this.user.auth.uid; 

     firebaseApp.database().ref('/users/' + this.userUID).once('value').then(function(snapshot) { 
     if (snapshot.val().email !== this.userEmail) { //ERROR HERE 
      console.log('update the email in database here'); 
     } 
     }); 

     console.log('User Logged in', this.user, this.userEmail, this.userUID); 
     return; 
    } 

    this.logout(); 
    console.log('User Not Authenticated', this.user); 
}); 
} 

エラーが、私はこの比較をしたい行にはもちろんである:私はJavaScriptを/ typescriptですでこれを知っている

if (snapshot.val().email !== this.userEmail) 

は非常に迷惑ですし、私が取得する方法を見つけることができません私のスクリプトは動作します。あなたは、矢印機能を使用する場合は

答えて

1

それはthis

firebaseApp.database().ref('/users/' + this.userUID).once('value').then((snapshot) => { 
    if (snapshot.val().email !== this.userEmail) { 
     console.log('update the email in database here'); 
    } 
}); 
+0

を使用してください。正常に動作しています...私のタイプスクリプト技能が必要です。 – BlackHoleGalaxy

1

これは、事前に変数にthisを保存し、それを使用して、通常let self = thisされる解決するJavaScriptの標準トリックを指し、どのような保持されます。 太字の矢印機能を使用する場合、TypeScriptでは言語がこれを行います。コンパイルされたJavaScriptコードは通常の関数を持ちますが、関数内に_thisという名前の変数を使用します。この変数は、thisではなく、事前にthisに初期化されています。 つまり、function (param) { // code }の代わりに(param) => { // code }