嗨,我有一个父 form control 和一个子组件。在父 form control 更改之前,子组件不会显示,例如:
<div *ngIf="parentControlChanged">
<ChildComponent [value]="parentChanged$ | async"></ChildComponent>
</div>
如您所见,子组件使用 async
管道从父控件获取 value (这里 parentControlChanged
是一个布尔状态,表示父控件首先更改,而 parentChanged$
只是一个管道parentControl.valueChanges 的一些附加副作用与此问题无关)。
问题是在父控件更改之前不会显示子组件,因此尚未订阅 valueChanges
,因此无法获取更改的父控件的 value。否则,子组件一旦显示就会获取父控件的每个后续更改value。
那么有没有办法让子组件在使用 async
管道订阅 valueChanges
后获取父控件的最新/当前 value,就像订阅 BehaviorSubject
一样?
回答1
如果其他东西已经订阅了 parentChanged$
那么,除了你没有进入的副作用之外,在它的末尾使用管道 shareReplay(1)
。
然后,只要 parentChanged$
已经被订阅,当子组件或其他任何东西订阅它时,它最初将获得最后一个发出的 value 并且任何副作用仍将执行一次,而不是每个订阅者执行一次。
如果 parentChanged$
尚未订阅,那么您要么必须始终订阅并执行上述操作,要么更改为您执行诸如将 xyz.valueChanges
更改为 concat(defer(() => of(xyz.value)), xyz.valueChanges)
之类的模式,以便在您订阅时,它以您要发送的初始 value,然后发送更改。