【发布时间】:2017-02-11 13:34:51
【问题描述】:
在我的应用程序中,我有以下 firebase 帖子结构:
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_added”、“child_removed”和“child_changed”。 但是,如果我将这些事件附加到查询列表中,它们将在每次原始帖子列表整体发生变化时触发。
所以,我正在考虑在这里采取什么方法。如果这是唯一不错的选择,我可能会将帖子数据复制到 firebase 中的“user_posts”列表中。但是,使用这种方法,我觉得查询几乎没有用,而且我失去了灵活性。我大约一周前才开始使用 firebase,所以我可能还有一些误解。
【问题讨论】:
-
我已经通过长列表了解了 AngularFire2 的行为。如果我是你,我不会为此付出任何努力,因为实现速度非常快,并且在使用
preserveSnapshot选项时与 Angular 的更改检测配合得很好。只有当未指定该选项时,整个列表才会出现变化。对此应该有一些可以做的事情,我将考虑提出问题并提交 PR。之后,我会回答你的问题。
标签: database angular firebase firebase-realtime-database angularfire2