Мне кажется, что я упускаю что-то простое, но у меня есть коллекция Firestore с некоторыми документами, имеющими поле ссылки на документ.Я хотел бы отобразить это поле в сервисе и вернуть строку из связанного документа.Я могу получить нужную строку из базы данных и распечатать ее на консоли, но не могу отобразить ее в приложении.
Я боролся с этим все утро.Я перепробовал много смешных вещей, но код, который у меня есть, должен работать.Я просто чувствую, что упускаю что-то простое.Из вывода консоли видно, что сначала выполняется код после оператора if.Я не уверен, почему.
After if statement:
courses.service.ts:38 {active: true, name: "Honors 10", section: "1st", standardsRef: DocumentReference}
courses.service.ts:37 After if statement:
courses.service.ts:38 {active: true, name: "Honors 10", section: "2nd", standards: "Add Standards"}
courses.service.ts:37 After if statement:
courses.service.ts:38 {active: true, name: "English 10", section: "4th", standardsRef: DocumentReference}
courses.service.ts:37 After if statement:
courses.service.ts:38 {active: true, name: "Honors 10", section: "5th", standards: "Add Standards"}
courses.service.ts:31 From if statement:
courses.service.ts:32 {active: true, name: "Honors 10", section: "1st", standardsRef: DocumentReference, standards: "Honors 10"}
courses.service.ts:31 From if statement:
courses.service.ts:32 {active: true, name: "English 10", section: "4th", standardsRef: DocumentReference, standards: "English 10"}
courses.service.ts
getCourses() : Observable<Course[]> {
return this.db.collection(`teachers/${this.userId}/courses`,
ref => ref.orderBy('section')).snapshotChanges()
.pipe(map(snaps => {
return snaps.map(snap => {
let course : Partial<Course> = snap.payload.doc.data();
if (course.standardsRef) {
this.db.doc(course.standardsRef).get()
.subscribe(snap => {
let standards = snap.data();
course.standards = standards.name;
console.log("From if statement:")
console.log(course);
});
} else {
course.standards = 'Add Standards';
};
console.log("After if statement:")
console.log(course);
return <Course> {
id : snap.payload.doc.id,
...course
};
});
}));
}
Я бы ожидал, что моя заявка покажет название стандартов из базы данных, если есть ссылка набазы данных и показать «Добавить стандарты», если нет.«Добавить стандарты» показывает.Где имя должно быть, оно пустое.Я не получаю никаких ошибок в консоли.
Я понятия не имею, что мне не хватает.Заранее спасибо.
Редактировать
Немного покопавшись, я извлек вложенную наблюдаемую область и написал два метода вместо одного, и, похоже, он работает.Я буду обновлять, если есть проблемы:
getCoursesDB() : Observable<Course[]> {
return this.db.collection(`teachers/${this.userId}/courses`,
ref => ref.orderBy('section'))
.snapshotChanges()
.pipe(map(snaps =>
convertSnaps<Course>(snaps))
);
}
getCourses() : Observable<Course[]> {
let coursesDB = this.getCoursesDB();
return coursesDB.pipe(map(courses => {
return courses.map(course => {
if (course.standardsRef) {
this.db.doc(course.standardsRef).get()
.subscribe(snap => {
let standards = snap.data();
course.standards = standards.name;
});
} else {
course.standards = "Add Standards";
}
return course;
});
}));
}