Не удается прочитать собственные afs (Angularfirestore) неопределенного в collection.set()

#angular #typescript #angularfire

#angular #машинопись #angularfire

Вопрос:

Я использую следующий код для перебора набора данных и изменения поля, если адрес электронной почты совпадает. Обратите внимание, что код вылетает на наборе. Итерация работает просто отлично. 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
        })
      }
    });
  });
}
  

Но я получаю:

ОШИБКА Ошибка: не перехвачено (в обещании): ошибка типа: не удается прочитать свойство ‘afs’ неопределенного типа Ошибка типа: не удается прочитать свойство ‘afs’ неопределенного типа

Где afs — это AngularFirestore

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

Комментарии:

1. ур constructor(private afs: AngularFirestore) { } такой

2. да @SouravDutta на самом деле консоль. журнал отображает всю коллекцию, поэтому afs работает для .get() . Это только в .set(), где я получаю ошибку

3. попробуйте это ниже 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 }) } }); }); }

4. @SouravDutta работает нормально, вот и все

Ответ №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
          })
        }
      });
    });
  

Комментарии:

1. он уже инициализирован, фактически код разбился на наборе, .get(), который использует .afs, тоже работает нормально

2. Не могли бы вы попробовать 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 }) } }); }); } просто полюбопытствовать об этом

3. Я протестировал его, и он удалил поле электронной почты, хотя теперь это не вызывает ошибки, я смотрел только на установку новой роли

4. Я отредактировал ответ без функции , вы должны использовать это 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 }
        )
      }
    });
  });
}