【发布时间】:2021-12-21 08:29:18
【问题描述】:
我正在调用一个 API 服务,它返回一个 Observable - 包含一个元素数组。
apiMethod(input: Input): Observable<ResultElement[]>
从这里我一直在选择数组的第一个元素,订阅它。然后使用该元素路由到另一个页面,如下所示:
this.apiService
.apiMethod(input)
.pipe(map((results) => results[0])
.subscribe(
(result) => {
return this.router.navigate('elements/', result.id)
}
)
这很好用。
问题是,我不想只使用第一个元素,我想要一个 MatDialog,或者其他类似的弹出,并给用户选择哪个元素的选项,然后路由到正确的元素.
如果列表只包含一个元素,则不应显示对话框,应立即路由用户。
我试图在.pipe(map()) 函数中打开一个对话框,但是subscribe() 在我得到用户的回答之前发生,导致它失败。而且我不确定这是否是正确的方法。你们中的任何人将如何解决这个问题?
编辑 最终完成了@BizzyBob 建议的部分工作:
在 API 调用中将 map 更改为 switchmap,如下所示:
this.apiService
.apiMethod(input)
.pipe(switchMap((results) => this.mapToSingle(results)
.subscribe(
(result) => {
return this.router.navigate('elements/', result.id)
}
)
mapToSingle(ResultElement[]) 是这样的:
private mapToSingle(results: ResultElement[]): Observable<ResultElement> {
if (result.length === 1){
return of(results[0]);
}
const dialogConfig = new MatDialogConfig<ResultElement[]>();
dialogConfig.data = results;
const dialogRef = this.dialog.open(ResultDialogComponent, dialogConfig);
return dialogRef.afterClosed();
}
【问题讨论】:
标签: javascript angular typescript rxjs angular-material