如何将多个主题整合为一个主题并对每个变化做出反应

我目前正在构建一个stepper组件,该组件的ng-content中呈现了多个step组件。在stepper组件中,我正在通过ContentChildren访问这些组件。每个步骤组件都有一个Subject,当Input值更改时,它会调用.next()。我这样做是为了通知Parent(StepperComponent),以便可以为视图重新创建模型。首先,我在foreach循环中订阅了每个主题。我想知道是否可以合并所有主题并订阅。因为我真的不在乎哪一步改变了,只是想知道那一步改变了。我目前已尝试使用merge()和CombineLatest(),当其中一个主题称为.next()时,两者均未触发。

这就是我用来合并和合并最新内容的方式

this.stepsOnChangeSubscription = merge(this.steps.map(s => s.onChanges$))
  .pipe(takeUntil(this.unsubscribe$)).subscribe(_ => this.createStepConfig());

this.stepsOnChangeSubscription = combineLatest(this.steps.map(s => s.onChanges$))
  .pipe(takeUntil(this.unsubscribe$)).subscribe(_ => this.createStepConfig());

步骤定义为

@ContentChildren(StepComponent) steps: QueryList<StepComponent>;

和$ unsubscribe只是要取消订阅ngOnDestroy

iCMS 回答:如何将多个主题整合为一个主题并对每个变化做出反应

使用combineLatest,您需要每个主题至少发出一次通知。

merge是正确的选择,但它需要一个扩展数组(即...myArray)。

因此,以下内容应会有所帮助:

this.stepsOnChangeSubscription = merge(...this.steps.map(s => s.onChanges$))
  .pipe(takeUntil(this.unsubscribe$)).subscribe(_ => this.createStepConfig());
本文链接:https://www.f2er.com/1752937.html

大家都在问