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