javascript - 调用 child_added 监听器时返回自动生成的 ID

标签 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)
            });
    });
}

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 来更新/删除等。

我用谷歌搜索了这个,不幸的是我没能找到任何关于这个的东西。

有人可以阐明我是如何处理这件事的吗?

最佳答案

与其将事件的快照值转换为 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);
  });
}

关于javascript - 调用 child_added 监听器时返回自动生成的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41438271/

相关文章:

javascript - Onsen-ui Carousel 属性自动播放不起作用

android - Ionic2: Http 发送 {"isTrusted":true} - 与其他可观察对象冲突?

Angular 组件 View 层不更新 localStorage 更改而不刷新

firebase - Firebase 云消息服务中的多播 ID

javascript - 如何根据 onUpdate 事件更新 bigquery 中的数据

javascript - 重用 if 语句中的代码。 (函数内部函数是不好的做法吗?)

<div> 中的 JavaScript 函数悬停

Javascript,从 Firebase 子项获取 autoId

javascript - 在 Bootstrap 3 中启用触摸事件的推荐方法?

angular - 可观察到的 : Cancel previous http request on new subscription call