【问题标题】:Angularfire - How to apply 'where' conditions with snapshotChanges()Angularfire - 如何使用 snapshotChanges() 应用“where”条件
【发布时间】: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


【解决方案1】:

我不太了解angularfire2firebase,但您可以利用数组的map 运算符和filter 运算符。

试试:

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

【讨论】:

  • 是的,这是可能的事情,但在我看来(我不确定),这种方法会导致重复的逻辑,即(1)过滤由 firebase 完成(2) 过滤由应用程序完成。这意味着最后我仍然从我想避免的firebase(服务器)获得全套数据。如果它只有几条记录,那没问题,但如果它是 10k+,这听起来有点错误。
  • 我和你有同样的担忧,但就像我说的那样,我不太了解这些技术:/
猜你喜欢
  • 2020-08-16
  • 2021-11-09
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多