Как извлечь Observable <Array []> из массива ссылок в angularfire2? - PullRequest
0 голосов
/ 28 апреля 2018

Допустим, у меня есть следующая структура, это означает, что у пользователя есть и массив объектов, содержащий ссылки на группы. Мне нужно получить одну наблюдаемую для массива ссылочных групп. Как я могу это сделать? Я пробовал много разных способов, но никто не прав.

enter image description here

Вот что я придумал:

export interface Group {
  students: DocumentReference[];
  title: string;
}

@Injectable()
export class GroupsService {

  constructor(private afs: AngularFirestore, private tutorsService: TutorsService) { }

  getCurrentTutorGroups(): Observable<Group[]> {
    return this.tutorsService.tutor.pipe(
      map(tutor => {
          return tutor.groupSubjects.map(groupSubject => groupSubject.group.get());
      }),
      mergeMap(group => fromPromise(group)),
      map(group => group.data() as Group)
    );
  }
}

    GroupSubjects {
      group: DocumentReference;
      subject: DocumentReference;
    }

    interface Tutor extends User {
      groupSubjects: GroupSubjects[];
    }

    @Injectable()
    export class TutorsService {
      tutor: Observable<Tutor>;

      constructor(private afs: AngularFirestore, private authService: AuthService) {
        this.tutor = this.authService.user.map((user: User) => {
          return {...user} as Tutor;
        });
      }
    }

export interface User {
  uid: string;
  email: string;
  name: string;
  role: string;
}

@Injectable()
export class AuthService {
  user: Observable<User | null>;

  constructor(private afAuth: AngularFireAuth,
              private afs: AngularFirestore) {
    this.setUser();
  }

  private setUser() {
    this.user = this.afAuth.authState
      .switchMap((user) => {
        if (user) {
          return this.afs.doc<User>(`users/${user.uid}`).snapshotChanges().map(action => {
            return {uid: action.payload.id, ...action.payload.data()};
          });
        } else {
          return Observable.of(null);
        }
      });
  }
}

Мне нужна функция getCurrentTutorGroups для возврата наблюдаемой типа Group [].

1 Ответ

0 голосов
/ 28 апреля 2018

Вот мое решение после всей борьбы

import { Injectable } from '@angular/core';
import {AngularFirestore} from 'angularfire2/firestore';
import {Observable} from 'rxjs/rx';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/operator/map';
import { firestore} from 'firebase';
import DocumentReference = firestore.DocumentReference;
import {GroupSubjects, TutorsService} from './tutors.service';
import {fromPromise} from 'rxjs/observable/fromPromise';

export interface Group {
  students: DocumentReference[];
  title: string;
}

@Injectable()
export class GroupsService {

  constructor(private afs: AngularFirestore, private tutorsService: TutorsService) { }

  private getTutorGroupsObservableArray(groupSubjects: GroupSubjects[]): Observable<Group>[] {
    return groupSubjects.map(groupSubject => fromPromise<Group>(groupSubject.group.get().then(group => group.data() as Group)));
  }

  getCurrentTutorGroups(): Observable<Group[]> {
    return this.tutorsService.tutor.map(tutor => Observable.combineLatest(this.getTutorGroupsObservableArray(tutor.groupSubjects))).mergeMap(group => group);
  }
}

Не забудьте добавить

import {Observable} from 'rxjs/rx';

вместо

import {Observable} from 'rxjs/Observable';

И еще одна вещь, которая помогла мне найти способ сделать это, это то, что я добавил свой закрытый метод, чтобы этот код был более очевидным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...