angularfire2增加值的最佳方法?

lui*_*ill 6 firebase ionic2 angular2-services angularfire2 angular

我搜索了许多论坛,问题,在doc但找不到正确的解决方案.

问题

使用angularfire2增加值的最佳方法是什么?
我看到我们可以使用[transaction()] []但实际上并不适用于angularfire2.还是快照?

user.service.ts

incrementLike(userToIncrementLike){
    this.af.database.object('users/' + userToIncrementLike.uid).subscribe((userObject) => {
      var newUser = {
        likes: userObject.likes + 1
        };

     });
     this.af.database.object('users/' + userToIncrementLike.uid).update(newUser);

  }
Run Code Online (Sandbox Code Playgroud)

我也试过这种方式:

incrementLike(userToIncrementLike){

    let obs = this.af.database.object('users/' + userToIncrementLike.uid);
    obs.subscribe((snapshot) => {
      let newValue = (snapshot.$value) ? (snapshot.$value + 1) : 1;
      obs.set(newValue);
    });
  }
Run Code Online (Sandbox Code Playgroud)

非常感谢你的帮助和提示:)路易斯.

Nab*_*bel 15

Firestore 现在increment()可以正确增加字段,即使多个用户同时竞争编辑

使用 Cloud Firestore 以原子方式递增值

在 angularfire2 中使用它

import { firestore } from 'firebase/app';

incrementLike(userToIncrementLike) {
    const increment = firestore.FieldValue.increment(1);
    const userLike = this.af.doc(`users/${userToIncrementLike.uid}`);
    userLike.update({ likes: increment });
}
Run Code Online (Sandbox Code Playgroud)

我直接使用了firestore,因为我FieldValue在angularfire2中找不到。


J. *_*nor 10

没有必要定义对象或使用该update()方法.该对象已存在于数据库中,因此您可以在其中进行处理.这实际上是为了transaction()- 在数据位置处理数据,从而防止冲突; 例如,两个用户同时更新相同的值.

如果您愿意,也可以在路径中使用模板文字.:)(注意反引号而不是单引号.)

incrementLike(userToIncrementLike){
    this.af.database.object(`users/${userToIncrementLike.uid}/likes`).query
    .ref.transaction(likes => {
        if (likes === null) {
            return likes = 1;
        } else {
            return likes + 1;
        }
    })
}
Run Code Online (Sandbox Code Playgroud)


Sif*_*eng 5

"angularfire2 V5"解决方案:

incrementLike(userToIncrementLike){
this.af.database.object(`users/${userToIncrementLike.uid}/likes`)
  .query.ref.transaction((likes => {
    if (likes === null) {
        return likes = 1;
    } else {
        return likes + 1;
    }
})};
Run Code Online (Sandbox Code Playgroud)