Я использую следующий код, чтобы перебрать набор данных и изменить поле, если электронная почта совпадает. Обратите внимание, что код дает сбой на множестве. Итерация работает нормально. 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.info(doc.id, " => ", doc.data());
if (doc.data().email == email) {
this.afs.collection("users").doc(doc.id).set({
role: 2
})
}
});
});
}
Но я получаю:
ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'afs' of undefined TypeError: Cannot read property 'afs' of undefined
Где afs — это AngularFirestore
import { AngularFirestore, AngularFirestoreCollection , AngularFirestoreDocument} from '@angular/fire/firestore';
да @SouravDutta на самом деле console.info отображает всю коллекцию, поэтому 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.info(doc.id, " => ", doc.data()); if (doc.data().email == email) { usersColl.doc(doc.id).set({ role: 2 }, { merge: true }) } }); }); }
@SouravDutta отлично работает, вот и все





Вы должны инициализировать его в конструкторе, тогда вы сможете использовать его с это.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.info(doc.id, " => ", doc.data());
if (doc.data().email == email) {
this.afs.collection("users").doc(doc.id).set({
role: 2
})
}
});
});
он уже инициализирован, на самом деле код разбился на съемочной площадке, .get(), который использует .afs, тоже работает нормально
Не могли бы вы попробовать 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.info(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/…
Это должно работать
onChangeRole(email) {
const usersColl = this.afs.collection("users");
usersColl.get().toPromise().then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
console.info(doc.id, " => ", doc.data());
if (doc.data().email == email) {
usersColl.doc(doc.id).set(
{ role: 2 },
{ merge: true }
)
}
});
});
}
ты такой
constructor(private afs: AngularFirestore) { }