Использование Observer в качестве наблюдаемого в Angular - PullRequest
0 голосов
/ 27 апреля 2018

Я просто запутался в наблюдаемых и предметах Ангулара. Я уже искал похожие вопросы, но не нашел правильного ответа на свои вопросы.

Допустим, у меня есть наблюдаемая переменная типа, которая прослушивает изменения данных в Firestore и сохраняет изменения следующим образом:

export class AcademyProvider {

  public currentAcademy: Observable < any > ;
  private db: any;

  constructor(public http: HttpClient,
    private afs: AngularFirestore,
    private accountProvider: AccountProvider) {
    this.db = firebase.firestore();
  }
  //This method gets the details of the current logged academy
  getCurrentAcademy(academyID): Promise < any > {
    return new Promise((resolve, reject) => {
      this.db.collection("academy").where("id", "==", academyID).onSnapshot(
        (academy) => {
          if (!academy.empty) {
            this.currentAcademy = academy.docs[0].data();
            console.log(this.currentAcademy);
            resolve(academy.docs[0].data());
          } else {
            //academy does not exist
            reject(false);
          }
        },
        //academy error
        (error) => {
          reject(error);
        })

    });
  }
}

Теперь я хочу прослушать переменные currentAcademy на разных страницах, например, на проигрывателях или на странице настроек, используя тот же AcademyProvider. Я имею в виду, что я хочу использовать переменную currentAcademy в качестве наблюдателя изменений Firestore (что в настоящее время выполняется с помощью приведенного выше кода), а также в качестве наблюдаемого, которое слушают компоненты других страниц.

Это возможно? Я сталкивался с некоторыми учебниками, использующими тип Subject, но у меня не получилось, чтобы он работал с моим кодом.

Примечание: я знаю, что могу получить значения переменной currentAcademy с других страниц, например: AcademyProvider.currentAcademy ['FieldName'] или около того, но это не всегда гарантирует, что возвращаемое значение является самым последним.

Заранее спасибо!

1 Ответ

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

Используйте Subject, если вам не нужно получать значение при инициализации наблюдения, используйте BehaviorSubject, если вы хотите получить значение при первой подписке на наблюдателя.

public currentAcademy: BehaviorSubject<any> = new BehaviorSubject(null);
public currentAcademy: Subject<any> = new Subject();

В вашей подписке, когда вы получаете данные, перенесите их в вашу тему:

this.currentAcademy.next(academy.docs[0].data());

В ваших компонентах вы теперь можете подписаться на этого наблюдателя:

this.myService.currentAcademy.subscribe(data => console.log(data));
...