2016-12-29 8 views
0

Я создаю приложение Angular2, используя Auth0 для аутентификации и AngularFire для моей базы данных. В моем конструкторе я передал экземпляр AngularFire af, но я не могу получить доступ к нему в своем событии обратного вызова. Есть ли другой способ доступа к экземпляру AngularFire?Angular2 - ИСКЛЮЧЕНИЕ: Невозможно прочитать свойство «af» неопределенного

// app/auth.service.ts 

import { Injectable } from '@angular/core'; 
import { tokenNotExpired } from 'angular2-jwt'; 
import { AngularFire, AuthMethods, AuthProviders } from 'angularfire2'; 


// Avoid name not found warnings 
declare var Auth0Lock: any; 
declare var Auth0: any; 

@Injectable() 
export class Auth { 
// Configure Auth0 
    lock = new Auth0Lock('AUTH0_CLIENT_ID', 'AUTH0_DOMAIN', {}); 


    constructor(private af: AngularFire) { 
    // Add callback for lock `authenticated` event 

    this.lock.on("authenticated", (authResult) => { 
     this.lock.getProfile(authResult.idToken, function(error:any, profile:any){ 
     if(error){ 
      throw new Error(error); 
     } 

     localStorage.setItem('id_token', authResult.idToken); 
     localStorage.setItem('profile', JSON.stringify(profile)); 

     var options = { 
     id_token : authResult.idToken, 
     api : 'firebase', 
     scope : 'openid name email displayName', 
     target: 'AUTH0_CLIENT_ID' 
     }; 


     var auth0 = new Auth0({domain:'AUTH0_DOMAIN', clientID:'AUTH0_CLIENT_ID' }); 
     auth0.getDelegationToken(options, function(err, result){ 

      if(!err){ 


      this.af.auth.login(result.id_token, { 
       provider: AuthProviders.Custom, 
       method: AuthMethods.CustomToken 
      }); 
      console.log(result); 
      } 
     }); 
     }); 
    }); 
    } 
} 

ответ

7

Это потому, что ваш this внутри обратного вызова функции указывает на эту функцию. У вас есть три варианта:

  1. Сохраните это класс: let that = this и использовать that.af внутри обратного вызова.
  2. Использование лямбда, потому что он не меняет this: (error, profile) => {...}
  3. Вы можете позвонить .bindTo(this) функционировать и связать это с классом

Кроме того, я рекомендую лямбда подход.

+1

Спасибо, я потратил дни, пытаясь выяснить, в чем проблема. – iamarnold

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

  • Нет связанных вопросов^_^