2016-10-28 110 views
1

我有一個簡單的系統,帶有來自Firebase的用戶身份驗證系統。我想要接收當前登錄用戶的數據列表。通過訂閱Firebase中的observable,我可以從當前登錄的用戶那裏獲取信息。在Angular2中執行函數之前獲取可觀察值

但是,在構造函數中設置的private authId的值在調用getAllEmails()函數之前未調用。因此${this.authId}產量未定義。在我的getAllEmails函數被調用之前,我如何確保從observable中獲得authId的準備好值?

import { Injectable } from '@angular/core'; 
import { AngularFire, FirebaseListObservable } from 'angularfire2'; 
import { Email } from '../email'; 
import { AuthService } from '../auth/auth.service'; 

@Injectable() 
export class EmailService { 

    private authId: string; 

    constructor(
    private af: AngularFire, 
    private authService: AuthService 
) { 
    this.authService.getUserInformation() 
     .subscribe(user => { 
     this.authId = user.authId; 
     }) 
    }  

    getAllEmails(): FirebaseListObservable<any> { 
    return this.af.database.list(`/emails/${this.authId}`); 
    } 

} 
+0

你在哪裏調用getAllEmails()? ngOnInit() –

+0

是的,然後將其分配給一個類變量 – user3642173

回答

1

有幾件事情,你可以爲這個

  1. 確實創造了一個基礎服務類,並得到驗證ID在基類
  2. 的構造在組件和調用構造函數得到AUTHID getAllEmails(AUTHID)

溶液低於:

export class baseService{ 

private authId: string; 

    constructor(private authService: AuthService) { 
    this.authService.getUserInformation() 
     .subscribe(user => { 
     this.authId = user.authId; 
     }) 
    } 
getAuthId(): number{ 
     return this.authId; 
} 
} 

import {baseService} from '<yourPath>' 

@Injectable() 
export class EmailService extends baseService { 

    private authId: string; 

    constructor(private af: AngularFire) { }  

    getAllEmails(): FirebaseListObservable<any> { 
    return this.af.database.list('/emails/'+ super.getAuthId()); 
    } 

} 

第二個解決辦法是:

,而不是基類有另一個服務類的控制器來獲得驗證ID,並把它傳遞。我認爲第一個解決方案好一點。

+0

謝謝你。但是,似乎你已經省略了EmailService中的super()調用。那看起來怎麼樣?當我試圖做超級(authService)時,我得到一個錯誤 – user3642173

+0

Kamran,你知道什麼是用你的設置進行super()調用的最佳設置嗎? – user3642173

+0

我剛剛給出了一個建議,請查看打印腳本文檔以調用基類方法 –