2017-01-03 49 views
1

我在firebase数据库中的数据结构如下:返回自动生成的ID时child_added监听器被称为

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

classBug看起来是这样的:

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

我google了这个,很遗憾,我一直没能找到任何东西。

有人可以告诉我如何去做这件事吗?

回答

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