我觉得我缺少一些简单的东西,但是我有一个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
};
});
}));
}
如果数据库上有引用,我希望我的应用程序显示数据库中的标准名称,如果没有引用,则显示“添加标准”。显示“添加标准”。名称应为空白。我在控制台中没有任何错误。
我不知道我缺少什么。预先感谢。
经过一番混乱后,我提取了嵌套的observable并编写了两个方法,而不是一个,它似乎正在工作。如果有问题,我会更新:
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;
});
}));
}