首页 > 解决方案 > Angularfire - 如何使用 snapshotChanges() 应用“where”条件

问题描述

我对 angular 和 firebase 比较陌生,并且当前使用 angular/fire 在服务中检索具有以下条件的集合;

服务.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的帖子。以下内容按预期工作,仅记录“已发布”帖子。

组件.ts

ngOnInit() {
    this.service.posts.subscribe(posts => {
      console.log(posts);
    })
}

但是,当添加“已发布”字段等于false的帖子时,该帖子也被记录在控制台中。

部分对我来说是有意义的,因为集合已更新并且组件已订阅它,从而导致更新。

但是,我的期望是,如果集合发生了变化,它仍然会应用条件并再次过滤掉。

谢谢大家帮助新手

标签: javascriptangularfirebasegoogle-cloud-firestoreangularfire2

解决方案


我不太清楚angularfire2firebase但你可以利用数组的map运算符和运算符。filter

尝试:

ngOnInit() {
    this.service.posts.pipe(
      map(posts => posts.filter(post => post.posted)),
    ).subscribe(posts => {
      console.log(posts);
    })
}

推荐阅读