1

我目前正在构建一个步进组件,该组件在其 ng-content 中呈现了多个步进组件。在步进器组件中,我通过 ContentChildren 访问这些组件。每个步骤组件都有一个 Subject,当 Input 值改变时调用 .next() 。我这样做是为了通知父级(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 中取消订阅

4

1 回答 1

2

combineLatest您收到通知之前,您需要每个主题至少发出一次。

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

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

this.stepsOnChangeSubscription = merge(...this.steps.map(s => s.onChanges$))
  .pipe(takeUntil(this.unsubscribe$)).subscribe(_ => this.createStepConfig());
于 2020-08-13T10:42:17.173 回答