【发布时间】:2020-03-13 16:55:35
【问题描述】:
我对 angular 和 firebase 比较陌生,目前使用 angular/fire 在服务中检索具有以下条件的集合;
service.ts
get posts() {
return this.afs
.collection<Todo>('posts', ref => {
let query:
| firebase.firestore.CollectionReference
| firebase.firestore.Query = ref;
query = query.where('posted', '==', true);
return query;
})
.snapshotChanges()
.pipe(
map(action =>
action.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
return { id, ...data };
}),
),
);
}
在组件中,我订阅 observable 以检索“已发布”字段等于 true 的帖子。以下内容按预期工作,仅记录“已发布”帖子。
component.ts
ngOnInit() {
this.service.posts.subscribe(posts => {
console.log(posts);
})
}
但是,当添加“posted”字段等于false的帖子时,该帖子也被记录在控制台中。
这部分对我来说是有意义的,因为集合已更新并且组件已订阅它,从而导致更新。
但是,我的期望是,如果集合发生了变化,它仍然会应用条件并再次过滤掉。
感谢大家对新手的帮助
【问题讨论】:
-
你能澄清一下吗?您的组件仅使用您显示的代码初始化一次(
ngOnInit()仅运行一次),它记录具有'posted'==false? 的文档或者你已经运行了两次(两次初始化组件)?如果您的应用程序预计会多次订阅snapshotChanges(),您也应该取消订阅(您通常在ngOnInit()订阅并在ngOnDestroy()取消订阅。如果您需要做的只是在模板中显示您的项目,则不要不需要手动订阅,可以使用async管道,这样订阅就自动处理了。 -
我也发现在每个文档中添加
id作为字段并使用valueChanges()而不是snapshotChanges()非常方便,但这无关紧要。 -
@Stratubas,我正在使用模式来添加帖子和主要组件,其中帖子列表永远不会被重新初始化/销毁(仍然实现了销毁和取消订阅),所以它总是在听当添加 'posted' == true 的项目时会发生变化,至少这是我的预期。
-
尝试打开另一个浏览器选项卡并从该选项卡添加 posted = false 帖子。它是否记录在第一个选项卡中?如果您使用 firebase 控制台手动添加它会怎样?还在登录吗?
-
@Stratubas,我尝试了你的建议,而不是手动订阅,我使用的是异步管道,它按预期工作。非常感谢您的帮助 :) 将不得不了解有关可观察对象的更多信息。
标签: javascript angular firebase google-cloud-firestore angularfire2