Коллекция AngularFire: обновить / заменить путь запроса новым - PullRequest
0 голосов
/ 27 марта 2020

У меня есть служба с AngularFirestore.collection Observable.

...
export class AppFirestoreService {
  public rootCategories$: Observable<Category[]>;

  constructor(private afs: AngularFirestore) {
    this.rootCategories$ = this.afs.collection<Category>(`categories`).snapshotChanges()
    .pip(
      ...
    );
  }
}

Проблема в том, что rootCategories$ имеет подписку в нескольких компонентах и ​​путь Мне нужно обновить на другой.

Поэтому я подумал о замене переменной rootCategories новой Observable, но я не уверен, будет ли старый Observable очищен из памяти. Есть ли способ сделать путь как переменную без создания другого Observable и оставления старого (или его подписки), существующего в памяти. Спасибо

Можете ли вы подсказать мне правильный способ решения этой проблемы.

Редактирование, чтобы уточнить: Как изменить текущую Наблюдаемую rootCategories$ новым путем и сделать уведомление о старой подписке с помощью новое излучаемое значение?

1 Ответ

0 голосов
/ 27 марта 2020

Я нашел решение, если кто-то не указал, что у него есть некоторые недостатки.

Сочетание BehaviorSubject и mergeMap решило мою проблему. Путь испускается и управляется из BehaviorSubject, а AngularFirestore.collection возвращается с новым путем:

import { Injectable } from '@angular/core';
import { AngularFirestore } from '@angular/fire/firestore'
import { Observable, BehaviorSubject } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
...
@Injectable(...)
export class AppFirestoreService {
  public rootCategories$: Observable<CategoryId[]>;
  private pathBS = new BehaviorSubject<string>('categories');

  constructor(private afs: AngularFirestore) {
    this.rootCategories$ = this.pathBS.asObservable().pipe(
      mergeMap(path => {
        return this.afs.collection<Category>(path).snapshotChanges()...
      })
    );
  }

  setNewPath(path: string) {
    this.pathBS.next(path);
  }
}
...