Свойство не определено, когда я получаю данные из Firebase - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть следующий сервис:

@Injectable({
providedIn: 'root'
})
export class DatabaseService {
  private users: any[] = [];
  constructor(private db: AngularFireDatabase) { }

  getUsuarios(): any {
    this.db.database.ref('/users').once('value').then(
      data => {
        let users;
        usuarios = data.val() ? data.val() : {};
        console.log(users);
        return users;
      }
    );
  }
} 

Но мне нужны данные, полученные из базы данных Firebase в моем HomeComponent.

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {

  users: any[] = [];
  constructor(private _databaseService: DatabaseService) {
    this.users = this._databaseService.getUsuarios();
    console.log(this.users);
  }

  ngOnInit() {
  }

}

Когда я показываю свой console.log, эта печатьundefined.

Могу ли я получить эти данные и распечатать их при открытии приложения?

РЕДАКТИРОВАТЬ:

Для запуска этого требуется только возврат Obvervable из DatabaseService.

getUsuarios(): Observable<any> {
    let usuarios: any;
    /*let usuarios = new Observable<any>();
    this.db.database.ref('/usuarios').on('child_added', (snapshot) => {
      usuarios =  new Observable<any>().of(snapshot.val());
    });
    return usuarios;*/
    return Observable.create(observer => {
      // this.db.database.ref('/usuarios').on('child_added', (snapshot) => {
        this.db.database.ref('/usuarios').once('value').then( snapshot => {

        usuarios = snapshot.val();
        observer.next(usuarios);
        observer.complete();
      });
    });
  }

И изменить ngOnInit

export class HomeComponent implements OnInit {

  private _UsuariosObservable: Observable<any>;
  public usuarios: any[] = [];
  constructor(private _databaseService: DatabaseService) {  }

  ngOnInit() {
    this._UsuariosObservable = this._databaseService.getUsuarios();

    this._UsuariosObservable.subscribe((data) => {
      this.usuarios = data;
      for (let i = 0; i < this.usuarios.length; i++) {
        console.log(this.usuarios[i]);
      }
    }, ( err ) => {
       console.log(err);
    });
  }

}

Спасибо за помощь!

1 Ответ

0 голосов
/ 16 сентября 2018

Вы должны подписаться следующим образом,

this._databaseService.getUsuarios().subscribe((res)=>{
       this.users = res;
    },(err)=>{
      console.log(err);
});
...