Firebase检索数据并作为类型数组返回 - 我的解决方案

时间:2018-01-15 08:49:24

标签: angular typescript firebase-realtime-database angularfire angularfire2

我最近开始将我的iOS应用程序移动到也是一个Web应用程序。我不知道这个实现是否正确。它有效,但如果有人可以请让我知道它是否正确。

以下是我的LicenceService中的功能:

get retriveLicences():Licence[] {

const licences: Licence[] = [];

this.afDatabase.list(this.basePath).valueChanges().subscribe((snapshot) => {
  snapshot.forEach(element => {

    const licenceObject = <any>element

    licences.push(
      new Licence(
        licenceObject.name, 
        licenceObject.logoUrl, 
        licenceObject.maxUsers, 
        licenceObject.currentUserCount, 
        licenceObject.startDate, 
        licenceObject.endDate
      )
    );
  });
});

return licences
}

1 个答案:

答案 0 :(得分:4)

使用rxjs运算符,您可以在订阅之前“转换”快照:

getLicences(): Observable<Licence[]> {
  return this.afDatabase
  .list(`/whatever`)
  .valueChanges()
  .map(licenceObjects => {
    return licenceObjects.map(licenceObject => new Licence(
      licenceObject.name, 
      licenceObject.logoUrl, 
      licenceObject.maxUsers, 
      licenceObject.currentUserCount, 
      licenceObject.startDate, 
      licenceObject.endDate
    ));
  })
}

但是,如果您使用数据库中的确切变量名称创建一个界面,那么您的生活将变得更加容易,因为angularfire2会为您进行转换:

interface Licence {
  name: string;
  logoUrl: string;
  maxUsers: number;
  currentUserCount: number;
  startDate: number;
  endDate: number;
}

getLicences(): Observable<Licence[]> {
  return this.afDatabase.list<Licence>(`/whatever`).valueChanges();
}

现在,在您的组件中,您可以从服务中获取observable,并使用异步管道或任何对您的应用程序更有意义的方式解开它。 我希望这有用!