2016-10-28 7 views
1

У меня есть простая простая система с системой аутентификации пользователей из Firebase. Я хочу получить список данных для пользователя, который в настоящее время вошел в систему. Я получаю информацию от текущего пользователя, подписавшись на наблюдаемый из Firebase.Получение наблюдаемого значения перед выполнением функции в Angular2

Однако значение private authId, которое установлено в моем конструкторе, не вызывается перед вызовом функции getAllEmails(). Поэтому значение ${this.authId} не определено. Как я могу убедиться, что у меня есть значение authId, готовое от наблюдаемого до того, как вызывается функция getAllEmails?

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. создать базовый класс обслуживания и получить AUTHID в конструкторе базового класса
  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()); 
    } 

} 

второе решение будет:

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

+0

Спасибо за это. Однако кажется, что вы опустили вызов super() в EmailService. Как это будет выглядеть? Когда я пытаюсь сделать super (authService), я получаю сообщение об ошибке – user3642173

+0

Kamran, знаете ли вы, какая самая лучшая настройка для вызова super() будет с вашей настройкой? – user3642173

+0

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

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