我有一个角度组件,它从 @Input 变量中获取数据,并使用它来过滤来自服务的其他数据。(简化的)结构如下所示:
<phones-component>
<phone-details>
<..>
<phone-history-component [phoneNumber$]="phoneNumber$"></phone-history-component>
<phone-details>
</phones-component>
电话详细信息组件:
changeLogs$: Observable<AuditLog[]>;
constructor(
private auditLogService: AuditLogService, //ngrx-data service
){
ngOnInit(): void {
this.changeLogs$ = combineLatest([this.phoneNumber$, this.auditLogService.entities$])
.pipe(
map(pn => pn[1].filter(logs => logs.pkId === pn[0].id))); //filters the logs to show only log entries from the corresponding phonenumber
}
路由配置如下:
{
path: 'phones',
component: PhonesComponent,
},
{
path: 'phones/:id',
component: PhoneDetailsComponent,
},
只要我从父容器“输入”PhoneDetailsComponent,一切都会按预期工作。当用户手动重新加载 PhoneDetails 视图时,changeLogs$ 数组为空,除非我手动注入解包后的 observable 的属性,如下所示:
<phone-history-component [phoneNumberId]="(phoneNumber$ | async).id" [phoneNumber$]="phoneNumber$"></phone-history-component>
如果我像这样注入 phoneNumber$
[phoneNumber]="(phoneNumber$ | async)"
它不起作用。(我不在组件中使用这些额外的输入)
现在我知道还有其他方法可以实现此功能,但我只是对代码为何如此表现感兴趣?
感觉就像我对基本的 rxjs 管道缺乏一些基本的了解。那么..这里到底发生了什么?
任何帮助表示赞赏。
更新
BizzyBob 是对的。直接重载组件函数第一次执行phoneNumber$
Observable 没有任何值filter
我通过快速检查解决了这个问题:
map(pn => {
return !!pn[0] ? pn[1].filter(logs => logs.pkId === pn[0].id) : null;
}));
现在..这是推荐的方法,还是有更好的方法?