根据传入的UniqueId检索记录 - firebase

时间:2017-01-15 00:59:18

标签: angular typescript firebase firebase-realtime-database

我正在构建一个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);

}

当它被记录到控制台时,它看起来如下所示:

enter image description here

当然这不是我的预期,我很难弄清楚返回与UniqueId匹配的记录的语法,我已经通过了Firebase文档,但不幸的是我可能感到困惑,导致这个问题被问到。那么问题是如何检索链接到UniqueId的数据?

提前致谢。

1 个答案:

答案 0 :(得分:1)

问题是child没有返回数据;它返回子参考。

要访问数据,您可以使用once方法(返回承诺)和value事件。

getBug(bugId: string): Promise<Bug> {

    return this.bugsDbRef
        .child(bugId)
        .once('value')
        .then(snapshot => snapshot.val() as Bug);
}

这假定Buginterface。如果它是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);
    });
}

而且,如果Bugclass,您需要创建一个实例;仅当Buginterface时才会使用演员表。