0

Я играю с Firebase в Angular2, и я застрял в доступе к 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); 
}); 
} 

Ошибка, конечно, на линии, где я хочу сделать такое сравнение:

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

Я знаю, что в JavaScript/машинопись очень раздражает, и я не могу найти способ, чтобы получить мой скрипт работает.

ответ

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

JavaScript стандартный трюк для решения этой проблемы является сохранение this в переменную заранее, а затем использовать его, как правило, let self = this. В языке TypeScript язык делает это для вас, когда вы используете функции жирной стрелки. Скомпилированный код JavaScript будет иметь регулярную функцию, но будет использовать переменную с именем _this внутри функции, которая была предварительно инициализирована до this, а не this. Короче говоря, вместо того, чтобы писать function (param) { // code }, используйте (param) => { // code }

Смежные вопросы