我正在构建一个Angular2
应用程序,它使用Firebase
来存储数据,当我的应用程序加载时,我检索所有项目并循环遍历它们并构建HTMl table
我的代码从Firebase
检索所有错误如下所示:
getAddedBugs(): Observable<any> {
return Observable.create(obs => {
this.bugsDbRef.on('child_added', bug => {
const newBug = bug.val() as Bug;
newBug.id = bug.key;
obs.next(newBug);
},
err => {
obs.throw(err)
});
});
}
我回来的结果是,我投射到我创建的Bug
模型,这是按预期工作的
我要做的是当用户点击我HTML table
中的任何给定行时,我想将UniqueId
针对该给定的错误传递给Firebase
并检索该记录的数据。
我有以下db ref:
private bugsDbRef = this.fire.database.ref('/bugs');
我传入UniqueId
,我的当前代码如下所示:
getBug(bugId: string) {
const bug = this.bugsDbRef.child(bugId);
console.log(bug);
}
当它被记录到控制台时,它看起来如下所示:
当然这不是我的预期,我很难弄清楚返回与UniqueId
匹配的记录的语法,我已经通过了Firebase
文档,但不幸的是我可能感到困惑,导致这个问题被问到。那么问题是如何检索链接到UniqueId
的数据?
提前致谢。
答案 0 :(得分:1)
问题是child
没有返回数据;它返回子参考。
要访问数据,您可以使用once
方法(返回承诺)和value
事件。
getBug(bugId: string): Promise<Bug> {
return this.bugsDbRef
.child(bugId)
.once('value')
.then(snapshot => snapshot.val() as Bug);
}
这假定Bug
是interface
。如果它是class
,则需要创建一个实例:
getBug(bugId: string): Promise<Bug> {
return this.bugsDbRef
.child(bugId)
.once('value')
.then(snapshot => snapshot.val() ? new Bug(snapshot.val()) : null);
}
此外,您的Observable.create
应该返回一个删除child_added
侦听器的函数,以便在取消订阅后进行清理:
getAddedBugs(): Observable<any> {
return Observable.create(obs => {
const listener = this.bugsDbRef.on('child_added',
bug => {
const newBug = bug.val() as Bug;
newBug.id = bug.key;
obs.next(newBug);
},
err => {
obs.throw(err)
}
);
return () => this.bugsDbRef.off('child_added', listener);
});
}
而且,如果Bug
是class
,您需要创建一个实例;仅当Bug
为interface
时才会使用演员表。