Наблюдаемая рекурсия Angularfire2 - PullRequest
0 голосов
/ 29 октября 2018

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

хранение-блок:

  • parent: DocumentRef для другого блока хранения.

Я пытаюсь создать массив из дерева родителей одного юнита. Я пытаюсь использовать рекурсию, поскольку я предполагаю, что это самый простой способ сделать это. Я знаю без наблюдаемых, это было бы что-то вроде следующего:

// Unit is an observable returned by valueChanges()
recurseParents(unit){
  if (unit === null) {
    return;
  }
  // Titles array defined onInit in Angular
  this.titles = [...unit, this.titles];
  recurseParents(this.unitService.getUnitById(unit.parent));
}

С наблюдаемыми Angularfire2 я не уверен, как этого добиться. Я пытался выполнить шаги с одинаковыми ссылками в рамках подписки, и время от времени это вызывало странное поведение, даже выполнение .take (1) перед вызовом подписки.

Конечная цель - выглядеть так:

[{root parent}, {sub parent 1}, {sub parent 2}, {original document}]

1 Ответ

0 голосов
/ 30 октября 2018

Вы можете использовать оператор .expand(), и это только один вкладыш:

expand(unit => unit === null ? empty() : this.unitService.getUnitById(unit.parent))

Примечание: empty() возвращает наблюдаемое, которое является пустым, и немедленно завершает поток.

Так что вы можете просто сделать что-то вроде:

let rootDoc$ = of(this.titles) //assign to the observables of your DocumentRef

rootDoc$
    .pipe(
        expand(unit => unit === null ? empty() : this.unitService.getUnitById(unit.parent))
    )
    .subscribe(unitValues => {
        this.titles = [...unitValues, this.titles];
    })
...