2017-06-22 6 views
0

私は認証サービスを試しています。 私はこれを使用しています:angle2サービスのサービスコンストラクタから値を取得する方法

@Injectable() 
export class AuthService { 

    authState: any = null; 

    constructor(private afAuth: AngularFireAuth, 
       private db: AngularFireDatabase, 
       private router:Router) { 

      this.afAuth.authState.subscribe((auth) => { 
       this.authState = auth; 

      }); 
      } 

    // Returns true if user is logged in 
    get authenticated(): boolean { 
    return this.authState !== null; 
    } 

認証された()関数は、ユーザーがログインしている場合でも、私に虚偽を与え続ける

私はコンストラクタでauthState(this.authState)をCONSOLE.LOGとき。 、私は値を取得しますが、コンストラクタの外でthis.authStateはnullです。私は間違って何をしていますか?

+0

どのようにサービスを利用していますか?私はあなたがアプリレベルまたはコンポーネントレベルでプロバイダとして宣言していることを意味します。認証された機能にアクセスするコンポーネントコードを共有できますか? –

+0

購読方法は非同期です。 subscribeが呼び出される前に認証されたメソッドを呼び出すと、falseが返されます。 –

+0

@BunyaminCoskuner、これを解決する方法は何でしょうか? –

答えて

0

良い方法は、あなたのサービスのコンストラクタ

編集で行ったように、あなたのコンポーネントにあなたは、このメソッドを購読することができます別の関数に

authenticated(): Observable<User> { 
    return this.afAuth.authState; 
    } 

を持っているだろう!あなたが値を必要とし、あなたのコンポーネントで問題

を複雑にする必要がありますなぜ

+0

[タイプ] 'Observable 'を 'boolean'に割り当てることはできません。 –

+0

返品の種類を変更するのを忘れました;]今すぐお試しください –

0

はあなたがcomplete.Pleaseチェックに非同期操作を待つAPP_INITIALIZERを使用することができ、この

authState : boolean; 

constructor(private afAuth: AngularFireAuth) { 

      this.afAuth.authState.subscribe((auth) => { 
       this.authState = (auth !== null) ? true : false; 

      }); 
      } 
0

を行います以下のコード:

AuthService.ts

@Injectable() 
    export class AuthService { 
     authState: any = null; 
    constructor(private afAuth: AngularFireAuth, 
      private db: AngularFireDatabase, 
      private router:Router) { 

     } 
    loadValue(){ 
     return new Promise((resolve, reject) => { 
      this.afAuth.authState.subscribe((auth) => { 
       this.authState = auth; 
       resolve(true); 
      }); 
     }); 
    } 
    // Returns true if user is logged in 
get authenticated(): boolean { 
    return this.authState !== null; 
} 
} 

app.module.ts

import { NgModule, APP_INITIALIZER } from '@angular/core'; 

@NgModule({ 
    //... 
    providers: [AuthService, 
    { 
     provide: APP_INITIALIZER, 
     useFactory: (authService: AuthService) =>() => authService.loadValue(), 
     deps: [AuthService], 
     multi: true 
    }] 
    ///.... 
}) 

はそれが役に立てば幸い!

関連する問題