angularfire2增值的最佳方法是什么?

时间:2017-03-04 13:59:46

标签: angular firebase ionic2 angular2-services angularfire2

我在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);

  }

我也是这样尝试的:

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);
    });
  }

非常感谢您的帮助和提示:) 路易斯。

5 个答案:

答案 0 :(得分:10)

没有必要定义对象或使用update()方法。该对象已存在于数据库中,因此您可以在其中进行处理。这实际上是transaction() - to work on the data at the data location的目的,因此可以防止冲突;例如,两个用户同时更新相同的值。

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

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

答案 1 :(得分: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;
    }
})};

答案 2 :(得分:3)

Firestore现在具有increment(),即使多个用户竞争同时进行编辑,它也可以正确地增加字段

Incrementing Values Atomically with 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 });
}

由于我在angularfire2中找不到FieldValue,因此直接使用了Firestore。

答案 3 :(得分:0)

@ angular / fire(Angular版本7)

https://firebase.google.com/docs/firestore/manage-data/transactions https://firebase.google.com/docs/firestore/query-data/get-data

incrementLike(userToIncrementLike) {

  //VARIABLE FOR MANAGING THE SCOPE
  var that = this;
  this.afs.firestore.collection("users").where("id", "==", userToIncrementLike.uid)
  .get()
  .then(function(querySnapshot) {

     querySnapshot.forEach(function(doc) {
        // doc.data() is never undefined for query doc snapshots
        console.log(doc.id, " => ", doc.data());

        return that.afs.firestore.runTransaction(function(transaction) {
           // This code may get re-run multiple times if there are conflicts.
           return transaction.get(doc.ref).then(function(doc) {
              if (!doc.exists) {
                 throw "Document does not exist!";
              }

              //THIS IS WHERE TO DO THE INCREMENT
              var new_score = doc.data().score + 1;
              transaction.update(doc.ref, { score: new_score });
           });
        }).then(function() {
           console.log("Transaction successfully committed!");
        }).catch(function(error) {
           console.log("Transaction failed: ", error);
        });

     });
  })
  .catch(function(error) {
     console.log("Error getting documents: ", error);
  });

}

答案 4 :(得分:0)

我在Firestore上使用它。相同的代码实际上用于实时DB。

"@angular/fire": "^5.1.2"

const login = this.afs.doc(`/users/${uid}`);
    login.valueChanges()
        .pipe(take(1))
        .subscribe((user: User) => {
            login.update({ login: user.login as number + 1 });
        });