Database Firebase Angular2-如何在没有太多开销的情况下查询和呈现列表

Database Firebase Angular2-如何在没有太多开销的情况下查询和呈现列表,database,angular,firebase,firebase-realtime-database,angularfire2,Database,Angular,Firebase,Firebase Realtime Database,Angularfire2,在我的应用程序中,我有以下firebase posts结构: posts: { text: ".." meta: {..} user: { id: "user1", username: ".." } } 我用的是angularfire2。 因此,为了获得特定用户发布的所有帖子,我运行以下查询: this.userPosts$ = this.af.database.list('/posts', { query: {

在我的应用程序中,我有以下firebase posts结构:

posts: {
    text: ".."
    meta: {..}
    user: {
        id: "user1",
        username: ".."
    }
}
我用的是angularfire2。 因此,为了获得特定用户发布的所有帖子,我运行以下查询:

this.userPosts$ = this.af.database.list('/posts', {
    query: {
      orderByChild: 'user/id',
      equalTo: userId
    }
  }).map( (posts) => {
    return posts.map(post => Post.unpack(post));
  }).publishReplay(1).refCount();
我听说这不是很有效,因为每次有什么变化(即使在一篇文章中),整个列表都会被重新加载,从而重新呈现。由于我的应用程序中有喜欢和不喜欢的东西,这种情况会经常发生。基本上,每次有人喜欢一篇文章,如果我没有弄错的话,整个列表都会为每个用户重新加载

我知道有一种方法可以在收听firebase事件时维护列表的本地副本:“添加了child_”、“删除了child_”和“更改了child_”。 但是,如果我将这些事件附加到查询的列表中,则每次原始帖子列表中的某些内容作为一个整体发生变化时,它们都会触发


因此,我正在考虑采取什么方法。如果这是唯一的好选择,我可能会将posts数据复制到firebase中的“user_posts”列表中。然而,使用这种方法,我觉得查询几乎毫无用处,并且失去了灵活性。大约一周前我开始使用firebase,所以我可能仍然有一些误解。

在研究这个问题时,我发现使用
FirebaseListObservable
实现时,
preserveSnapshot
false
——默认行为。每次可观测对象发出一组未包装的快照时,数组元素都是不同的实例——即使元素本身没有改变。这导致了更低效的变化检测

A和将包含在AngularFire2的下一个版本中(即
2.0.0-beta.7
之后的版本)

使用此修复程序,如果使用AngularFire2的
FirebaseListObservable
更改检测,那么AngularFire2的DOM更新非常快速有效

我通常将组件分为两部分,容器组件保存可观察组件,表示组件使用
OnPush
change-detection

容器组件的外观如下所示:

从“@angular/core”导入{Component};
从“angularfire2”导入{AngularFire,FirebaseListObservable};
@组成部分({
选择器:“项目容器”,
模板:``
})
导出类项目容器{
私有项:FirebaseListObservable运算符:

导入“rxjs/add/operator/auditTime”;
this.items=angularFire.database.list(“一些/快速变化/数据”{
查询:{
限时:10
}
})
.审核时间(0);

我已经了解了AngularFire2在长列表中的行为。如果我是你,我不会为此付出任何努力,因为当使用
preserveSnapshot
选项时,实现速度非常快,Angular的更改检测效果也很好。只有在未指定该选项的情况下,整个列表才会出现更改。有应该是一些可以做的事情,我会考虑提出一个问题,并提交一份公关。在那之后,我会回答你的问题。