Angularfire2 可观察递归
Angularfire2 Observable Recursion
我正在尝试通过遍历文档并抓取它们的 parent 来创建一个 "breadcrumbs" 列表。我的数据结构如下所示:
storage-unit:
- parent: DocumentRef 到另一个存储单元。
我正在尝试制作 parent 的单个单元树的数组。我正在尝试使用递归,因为我认为这是最简单的方法。我知道如果没有 observables,它会像下面这样:
// 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 的 observables,我不确定如何实现。我尝试在订阅中执行 same-ish 步骤,有时会产生奇怪的行为,甚至在调用订阅之前执行 .take(1)。
最终目标是这样的:
[{root parent}, {sub parent 1}, {sub parent 2}, {original document}]
您可以使用 .expand()
运算符,它只是一行:
expand(unit => unit === null ? empty() : this.unitService.getUnitById(unit.parent))
注意:empty()
returns 一个空的 Observable 并立即终止流。
所以你可以按照以下方式做一些事情:
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];
})
我正在尝试通过遍历文档并抓取它们的 parent 来创建一个 "breadcrumbs" 列表。我的数据结构如下所示:
storage-unit:
- parent: DocumentRef 到另一个存储单元。
我正在尝试制作 parent 的单个单元树的数组。我正在尝试使用递归,因为我认为这是最简单的方法。我知道如果没有 observables,它会像下面这样:
// 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 的 observables,我不确定如何实现。我尝试在订阅中执行 same-ish 步骤,有时会产生奇怪的行为,甚至在调用订阅之前执行 .take(1)。
最终目标是这样的:
[{root parent}, {sub parent 1}, {sub parent 2}, {original document}]
您可以使用 .expand()
运算符,它只是一行:
expand(unit => unit === null ? empty() : this.unitService.getUnitById(unit.parent))
注意:empty()
returns 一个空的 Observable 并立即终止流。
所以你可以按照以下方式做一些事情:
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];
})