【问题标题】:Cannot read propery afs (Angularfirestore) of undefined on collection.set()无法读取 collection.set() 上未定义的属性 afs (Angularfirestore)
【发布时间】:2019-09-03 03:39:23
【问题描述】:

我使用以下代码来遍历数据集合,并在电子邮件匹配时更改字段。请注意,代码在片场崩溃。迭代工作得很好。 afs 被初始化为 AngularFirestore

onChangeRole(email) {
  this.afs.collection("users").get().toPromise().then(function (querySnapshot) {
    querySnapshot.forEach(function (doc) {
      // doc.data() is never undefined for query doc snapshots
      console.log(doc.id, " => ", doc.data());

      if (doc.data().email == email) {
        this.afs.collection("users").doc(doc.id).set({
          role: 2
        })
      }
    });
  });
}

但我收到了:

ERROR 错误:未捕获(承诺中):TypeError:无法读取未定义的属性“afs” TypeError:无法读取未定义的属性“afs”

其中 afs 是 AngularFirestore

import { AngularFirestore, AngularFirestoreCollection , AngularFirestoreDocument} from '@angular/fire/firestore';

【问题讨论】:

  • 你的constructor(private afs: AngularFirestore) { }是这样的
  • 是的 @SouravDutta 实际上 console.log 显示了整个集合,所以 afs 正在为 .get() 工作。它仅在我收到错误的 .set() 中
  • 在下面试试这个onChangeRole(email) { const usersColl = this.afs.collection("users"); usersColl.get().toPromise().then(function (querySnapshot) { querySnapshot.forEach(function (doc) { // doc.data() is never undefined for query doc snapshots console.log(doc.id, " => ", doc.data()); if (doc.data().email == email) { usersColl.doc(doc.id).set({ role: 2 }, { merge: true }) } }); }); }
  • @SouravDutta 工作正常,就是这样

标签: angular typescript angularfire


【解决方案1】:

你必须在构造函数中初始化它,然后你就可以像你尝试的那样将它与 this.afs 一起使用。

举例:

constructor(private afs: AngularFirestore) { }

编辑: 更改箭头功能使用的功能词:

this.afs.collection("users").get().toPromise().then( querySnapshot => {
      querySnapshot.forEach( doc => {
        // doc.data() is never undefined for query doc snapshots
        console.log(doc.id, " => ", doc.data());

        if (doc.data().email == email) {
          this.afs.collection("users").doc(doc.id).set({
            role: 2
          })
        }
      });
    });

【讨论】:

  • 它已经初始化了,实际上代码在片场崩溃了,使用 .afs 的 .get() 也可以正常工作
  • 你可以试试onChangeRole(email) { const usersColl = this.afs.collection("users"); usersColl.get().toPromise().then(function (querySnapshot) { querySnapshot.forEach(function (doc) { // doc.data() is never undefined for query doc snapshots console.log(doc.id, " => ", doc.data()); if (doc.data().email == email) { usersColl.doc(doc.id).set({ role: 2 }) } }); }); } 只是好奇
  • 我测试了一下,它删除了电子邮件字段,虽然现在它不会导致错误,我正在寻找只是设置一个新角色
  • 我编辑了没有函数的答案,你应该使用这个developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:

这应该可以工作

onChangeRole(email) {
  const usersColl = this.afs.collection("users");
  usersColl.get().toPromise().then(function (querySnapshot) {
    querySnapshot.forEach(function (doc) {
      console.log(doc.id, " => ", doc.data());
      if (doc.data().email == email) {
        usersColl.doc(doc.id).set(
          { role: 2 },
          { merge: true }
        )
      }
    });
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 2020-10-30
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多