如果文档属性等于值,则调用函数

时间:2018-09-19 13:28:35

标签: angular firebase google-cloud-firestore

我正在尝试检查用户的isActive属性是否设置为false。如果是,那么我需要注销用户。我知道这不是实现此目标的最佳方法,但可以稍后进行更改。我正在执行以下操作,但是它说this是未定义的。如何从.then

内调用函数
signOut() {
  this.afAuth.auth.signOut()
    .then(() => {
      this.router.navigate(['/']);
    });
}

checkIfActive(id: string) {
  return this.afs.collection("users").doc(id).ref.get()
    .then(function(doc) {
      if (doc.exists) {
        if (doc.data().isActive === false) {
          this.signOut(); // <------ says 'this' is undefined
        }
      } else {
        console.log("No such document!");
      }
    })
    .catch(function(error) {
      console.log("Error getting document:", error);
    });
}

2 个答案:

答案 0 :(得分:2)

如果您要从signOut访问thenable函数,则需要使用Arrow functions

使用then(function(doc) {代替then(doc => {。这将允许this访问原始上下文。

  

箭头函数按词法绑定它们的上下文,因此实际上是指原始上下文

checkIfActive(id: string) {
  return this.afs.collection("users").doc(id).ref.get()
    .then(doc => {
      if (doc.exists) {
        if (doc.data().isActive === false) {
          this.signOut();
        }
      } else {
        console.log("No such document!");
      }
    })
    .catch(function(error) {
      console.log("Error getting document:", error);
    });
}

答案 1 :(得分:0)

您不能在“ Funtion(){}”中使用“ this”,因为它不在其范围内。您必须使用“()=> {}”箭头功能。

checkIfActive(id: string) {
    return this.afs.collection("users").doc(id).ref.get()
      .then((doc) => {
          if (doc.exists) {
            if (doc.data().isActive === false) {
              this.signOut(): <------says 'this' is undefined
            }
          } else {
            console.log("No such document!");
          }
      }).catch(function(error) {
        console.log("Error getting document:", error);
      });
  }