Сопоставление ссылочного поля документа из Firestore в Angular Service - PullRequest
0 голосов
/ 03 июня 2019

Мне кажется, что я упускаю что-то простое, но у меня есть коллекция 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;
      });
    }));
  }
...