angular - 异步管道未订阅 Observable Angular
问题描述
在 Angular (v12) 中,我有以下组件(使用虚拟变量名称):
export class DataDetailsComponent {
data$: Observable<MyDataModel>;
constructor(dataService: DataService, route: ActivatedRoute, private router: Router) {
this.data$ =
combineLatest([dataService.getDataObservable(), router.events])
.pipe(
filter(([,event]) => event instanceof ActivationEnd),
tap(([data, event]) => console.log((<ActivationEnd>event).snapshot.queryParams['id'])),
map(([data, event]) => data.filter(c => c.id === (<ActivationEnd>event).snapshot.queryParams['id'])[0]),
tap(dataItem => console.log(dataItem))
);
this.data$.subscribe(); // console.logs don't work without this
}
}
及其模板:
<div *ngIf="data$ | async as data; else loading">
<img [src]="data.url" [alt]="data.name">
</div>
<ng-template #loading>Loading...</ng-template>
数据没有被渲染,如果我实际上没有订阅data$
. 另一方面,当我做 place 时this.data$.subscribe();
,控制台得到正确的输出,但视图仍然是空的(挂在Loading...上)。
谁能解释发生了什么?
解决方案
最后,是路由器事件没有让 observable 完成。显然,如果我将导航从模板移动到 .ts 并订阅ActivatedRoute.params
而不是Router.events
.
所以,父组件得到:
navigateToDetails(id: string): void {
this.router.navigate(['/myRoute', id]);
}
而不是routerLink
在模板中使用:
<a [routerLink]="['/myRoute']" [queryParams]="{id: item.id}">
然后,DataDetailsComponent
我可以这样做:
constructor(dataService: DataService, route: ActivatedRoute) {
this.data$ =
combineLatest([dataService.getDataObservable(), route.params])
.pipe(map(([data, params]) => data.filter(c => c.id === params['id'])[0]));
}
在这一点上,原因超出了我的范围。
推荐阅读
- ubuntu - 在 Ubuntu 20.04 的 GPU 上安装 xgboost:CUDA 编译器“/usr/bin/nvcc”无法编译
- excel - 将动态范围复制到新工作表
- angular - 如何将此模型数据传递给 Angular 中的子组件?
- angular - Angular 响应式表单在网络控制台中返回 data:image/png;base64 而不是点击登录 API
- c++ - 当库被静态和动态链接时,静态类的变量和方法会发生什么
- node.js - Firebase 函数在本地工作,但在调用服务器部署版本时返回 "error":"MODULE_NOT_FOUND"
- html - 如何将 localStorage 中的数据保存为数组?
- apache-kafka - 使用 Confluent Dotnet 到 Azure EventHub 的 kafka 端点
- javascript - '[WDS] 已断开连接!' 是什么意思?错误意味着 webpack 和 Vue.js?
- gcc - 当进程收到信号时线程会发生什么?