【问题标题】:Retrieve record based off UniqueId passed in - firebase根据传入的 UniqueId 检索记录 - firebase
【发布时间】:2017-01-15 00:59:18
【问题描述】:

我正在构建一个 Angular2 应用程序,它使用 Firebase 来存储数据,当我的应用程序加载时,我检索所有项目并循环通过它们并构建一个 HTMl table 我的代码以从 @987654326 检索所有错误@ 如下所示:

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 并检索给定记录的数据。

我有以下数据库参考:

private bugsDbRef = this.fire.database.ref('/bugs');

我传入UniqueId,我当前的代码如下所示:

getBug(bugId: string) {

    const bug = this.bugsDbRef.child(bugId);

    console.log(bug);

}

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

这当然不是我所期望的,我正在努力找出返回与UniqueId 匹配的记录的语法,我已经阅读了Firebase 文档,但不幸的是我可能会感到困惑导致被问到这个问题。那么问题是如何检索链接到UniqueId 的数据?

提前致谢。

【问题讨论】:

    标签: angular typescript firebase firebase-realtime-database


    【解决方案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 时才适用。

    【讨论】:

    • 太棒了,感谢您的描述性答案!,尽管从源代码中我了解到的问题指出,需要有“child_added”方法来检索其他人保存的任何错误我的表会自动更新为新记录。如果我像您所说的那样删除它,那么根据我的理解,它会停止自动更新表格吗?或者我又搞糊涂了。
    • 如果 observable 被取消订阅,你想移除监听器。否则,它只是一个泄漏。只要有订阅者,它仍然会监听child_added 事件。这只是清理的东西。
    • 好的,我明白了,Bug 也是一个模型,当我尝试您的第二个示例时,我收到的错误类型 firebase.Promise 未分配给类型 Promise 属性 [类型 Promise 中缺少 Symbol.toStringTag]
    • 听起来你有一些不寻常的默认Promise 实现。或者 Firebase 可能在 Promise polyfill 或其他东西之前被包含在内。无论如何,这是一个 TypeScript 的事情,抛弃这个问题应该足够安全:.then(snapshot =&gt; snapshot.val() ? new Bug(snapshot.val()) : null) as Promise&lt;Bug&gt;;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2018-07-04
    • 2017-06-11
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多