2016-10-28 24 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

我刚刚给出了一个建议,请查看打印脚本文档以调用基类方法 –