【问题标题】:Increment a value inside Firebase document using AngularFire2 @angular/fire V5使用 AngularFire2 @angular/fire V5 在 Firebase 文档中增加一个值
【发布时间】:2019-03-22 17:21:10
【问题描述】:

我在 Firebase 中有一个文档,其中包含我想要增加的值,但我在 Angularfire2 的文档中没有看到有关如何执行此操作的任何内容。

我尝试使用这个答案Create or increment a value with Angular2/AngularFire2 但失败了,因为我的 this.db 实例无法识别对象方法。

** 更新 **

通过执行以下操作,我能够在一定程度上让我的代码执行我想做的事情:

incrementChoice(choiceKey) {
    this.db.doc(choiceKey).valueChanges().subscribe((choice:any) => {
      this.db.doc(`choices/${choiceKey}`)
        .update({
          votes: ++choice.votes
        });
    })
  }

然而,问题是我现在陷入了一个无限的递增循环,因为每次值递增时,订阅都会启动并再次递增。我不知道如何获得选择投票值?有人可以帮我重构这个,以便我可以使用它的键获得一个选择对象,并且在我更新投票值时不受订阅的限制?

我知道可以通过获取整个集合来获取对象,但对于我的用例,我不想依赖整个集合来获取对象并从该对象中获得投票值。我已经有了对象 Key。

【问题讨论】:

    标签: angular firebase angularfire2


    【解决方案1】:

    试试这个:

    this.afs.doc(`choices/${choice.key}`)
      .update({
        votes: ++choice.votes
      });
    

    这里有一个Working Sample StackBlitz 供您参考。

    【讨论】:

    • 找不到名称“选择”。在这个例子中,选择应该指什么?另外,更新函数是否会考虑同时更新的不同客户端之间的冲突?
    • 嗯。实际上,这只是一个示例,向您展示如果您已经拥有 Document 对象,如何更新 Document。如果您查看我的示例 stackBlitz,您会发现我已经拥有 valuation 对象,并且我只是根据用户的点击更新它们的 votes 属性。
    • 它看起来有效。谢谢!您知道这是否可以与使用 firebase 文档中的事务相提并论吗?本来我打算用一个事务来防止不同的客户端同时递增。
    • 另外,您知道如何在不附加 snapShot 或 valueChange 侦听器的情况下获取文档吗?目前,当我递增时,它会陷入无限循环,因为我在 snapShot 代码块内递增
    • 我之前分享的示例是通过获取完整集合的值来实现的。然后根据单击的项目,更新特定文档的值。
    【解决方案2】:

    能够使其与以下内容一起工作(感谢@SiddAjmera 帮助我走上正轨):

      incrementChoice(choiceKey) {
        const choiceDoc:any = this.db.collection('choices').doc(choiceKey);
        choiceDoc.ref.get().then(choice => {
          let votes = choice.data().votes
          choiceDoc.update({
            votes: ++votes
          });
        });
    

    【讨论】:

      猜你喜欢
      • 2020-05-25
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2021-08-28
      相关资源
      最近更新 更多