调用child_added侦听器时返回自动生成的ID

时间:2017-01-03 07:15:30

标签: javascript angular firebase firebase-realtime-database

我的firebase数据库中有以下数据结构:

enter image description here

我添加了child_added方法,该方法在运行应用程序时返回firebase的所有条目,然后将其显示在HTML表中。

问题是,它没有为每个错误返回自动生成的Id。

这是我的方法:

 getAddedBugs(): Observable<any> {
    return Observable.create(obs => {
        this.bugsDbRef.on('child_added', bug => {
            const newBug = bug.val() as Bug;
            obs.next(newBug);
        },
            err => {
                obs.throw(err)
            });
    });
}

class Bug如下所示:

export class Bug {
 constructor(
     public id: string,
     public title: string,
     public description: string,
     public status: number,
     public severity: number,
     public createdBy: string,
     public createdDate: number,
     public updatedBy?: string,
     public updatedDate?: number
  ) {}
}

那么问题是,如何让我的方法也包括自动生成的Id,因为我需要这个Id来更新/删除等。

我用谷歌搜索过,不幸的是我无法找到任何相关信息。

有人可以说明我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

而不是将事件的快照价值投射到Bug(它不是Bug;它只是Object }),您应该使用快照中的信息创建Bug实例。快照包含密钥(自动生成的ID)和值:

getAddedBugs(): Observable<any> {
  return Observable.create(obs => {
    this.bugsDbRef.on('child_added',
      snapshot => {
        // The snapshot's value will be an Object, not a Bug instance.
        const val = snapshot.val();
        const bug = new Bug(
          snapshot.key, // The auto generated ID.
          val.title,
          val.description,
          ... etc.
        );
        obs.next(bug);
      },
      err => {
        obs.throw(err)
      });
    });
}

您还应该考虑返回一个在取消订阅时删除事件侦听器的函数:

getAddedBugs(): Observable<any> {
  return Observable.create(obs => {
    const listener = snapshot => {
      const val = snapshot.val();
      const bug = new Bug(
        snapshot.key,
        val.title,
        val.description,
        ... etc.
      );
      obs.next(bug);
    }
    this.bugsDbRef.on('child_added', listener, err => { obs.throw(err) });
    return () => this.bugsDbRef.off('child_added', listener);
  });
}