订阅前如何获取表单控件的valueChanges值?

How to get a form control valueChanges value before subscription?

您好,我有一个父表单控件和一个子组件。子组件只有在父表单控件发生变化后才会显示,例如:

<div *ngIf="parentControlChanged">
  <ChildComponent [value]="parentChanged$ | async"></ChildComponent>
</div>

如您所见,子组件正在使用 async 管道从父控件获取值(这里 parentControlChanged 是一个布尔状态,表示父控件首先被更改并且parentChanged$ 只是 parentControl.valueChanges 的一个管道,还有一些与这个问题无关的额外副作用。

问题是子组件只有在父控件更改后才会显示,因此还没有订阅 valueChanges,因此无法获取父控件的更改值。否则,一旦显示,子组件将获取父控件的每个后续更改值。

那么有没有一种方法可以让子组件在使用 async 管道订阅 valueChanges 后获取父控件的 latest/current 值,就像订阅 BehaviorSubject?

如果其他内容已经订阅 parentChanged$ 那么,除了您没有涉及的副作用之外,在它的末尾加入 shareReplay(1)

那么,只要parentChanged$已经被订阅了,当子组件或者其他任何订阅它的时候,它最初会得到last-emitted值 任何副作用仍将执行一次,而不是每个订阅者一次。

如果 parentChanged$ 尚未订阅,那么您要么必须始终订阅并执行上述操作,要么更改为一种模式,您可以将 xyz.valueChanges 更改为 concat(defer(() => of(xyz.value)), xyz.valueChanges) 这样当您订阅时,它会以您要发送的初始值开始,然后 发送更改。