如何在Angular 7 FormGroup valueChanges中的多个订阅列表中删除特定的订阅?

时间:2019-05-17 13:40:13

标签: angular rxjs angular-forms rxjs6

我正在使用angular 7 Multiple FormControl valueChanges订阅函数。

如何删除或取消订阅特定的FormControl订阅功能。

FormControlsSubscribe(){
  const FormControlsArray = Object.keys(this.FGroup.controls);
     FormControlsArray.map(controlName => {
     const control = this.FGroup.controls[controlName] as FormControl;
     control.valueChanges.subscribe(change => {
        console.log(controlName + '>>>' + change);
     });
  });
};



RemoveControl(ControlKey: any) {
  this.FGroup.removeControl(ControlKey);
}

我希望已删除的控件取消订阅;

2 个答案:

答案 0 :(得分:0)

鉴于您没有将control.valueChanges.subscribe分配给任何变量,因此您不能这样做。

此外,使用此代码将导致严重的内存泄漏。您永远不会关闭订阅,这是一种非常危险的管理方式。

答案 1 :(得分:0)

您可以使用takeUntil自动退订:

private unsubscribe$: Subject<void> = new Subject<void>();

control.valueChanges
pipe(takeUntil(this.unsubscribe$))
.subscribe(_ => {
  console.log(controlName + '>>>' + change);
});

ngOnDestroy() {
  this.unsubscribe$.next();
  this.unsubscribe$.complete();
}

或者您可以将control.valueChanges.subscribe分配给变量(订阅),然后取消订阅。

let subs: Subscription[] = [];

FormControlsArray.map(controlName => {
  const control = this.FGroup.controls[controlName] as FormControl;
  this.subs.push(control.valueChanges.subscribe(() => {}));
});

ngOnDestroy() {
  this.subs.forEach(sub => sub.unsubscribe());
  this.subs = [];
}