在Angular Service中从Firestore映射文档参考字段

时间:2019-06-03 12:49:11

标签: google-cloud-firestore angular7 angularfire2

我觉得我缺少一些简单的东西,但是我有一个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;
      });
    }));
  }

0 个答案:

没有答案