我有一个Observable,其中User有一个我希望迭代的数组属性Posts [],调用一个带有中间值的方法,然后返回一个带有结果对象作为数组的Observable。
目前我有以下代码可行:
public ngOnInit() {
const results: any[] = [];
this.controlData$ = this.controlContent$
.pipe(
filter((input) => input !== null),
flatMap((p: IControlContentSection) => p.controlPerformers),
map((m: IControlPerformer) => {
results.push({
...m,
nextOccurrence: this.getNextControlDate(m.controlFrequency, m.firstOccurrence),
});
return results;
}),
takeUntil(this.destroy$),
);
}
我使用数组变量results: any[]
,但我不喜欢这个解决方案,因为它依赖于这个外部变量,只有在组件被初始化时才能工作。
我尝试在地图后使用toArray()
或reduce((x, y) => x.concat(y), [])
,但这会在模板中解析为 null 。
如何在不需要外部变量的情况下返回Observable?
在模板中,我通过异步管道订阅:
<div *ngIf="controlData$ | async as controllers">
...
<div *ngFor="let ctrl of controllers; trackBy:ctrl?.userId">
...
</div>
</div>
答案 0 :(得分:1)
你在地图后正确地做它,它应该工作。但要模拟您的确切行为,您需要扫描操作员。当您返回结果数组时,扫描运算符将发出中间值。 你试过这样的吗?:
public ngOnInit() {
this.controlData$ = this.controlContent$
.pipe(
filter((input) => input !== null),
flatMap((p: IControlContentSection) => p.controlPerformers),
map((m: IControlPerformer) => {
return {...m,
nextOccurrence: this.getNextControlDate(m.controlFrequency, m.firstOccurrence),
};
}),
scan((acc, cur) => [...acc, cur], [])
takeUntil(this.destroy$),
);
}
它应该可以工作,如果没有,我可以提供给你一个左右。
希望这有帮助。