Angular FormArray valueChanges 更改后执行多​​次

cel*_*ade 0 angular angular-reactive-forms

我有一个带有 FormAwway 的表单,其中显示了所购买的产品,这是我的组件:

constructor() {
    this.purchaseForm = new FormGroup({
        id: new FormControl(null, Validators.required),
        purchase: new FormControl(null, Validators.required),
        date: new FormControl(null, Validators.required),
        products: new FormArray([]),
    });
}

public createNewLine(object: any = {}): FormGroup {
    const newLine = new FormGroup({
      index: new FormControl(null),
      id: new FormControl(object.id, Validators.required),
      id_product: new FormControl(object.id_produto, Validators.required),
      quantity: new FormControl(object.quantidade, Validators.required),
      value_unit: new FormControl(object.valor_unitario, Validators.required),
      value_total: new FormControl(object.valor_total, Validators.required),
    });

    const formArray = <FormArray>this.purchaseForm.get('products');
    newLine.get('index').patchValue(formArray.length);
    newLine.valueChanges.pipe(debounceTime(400)).subscribe(value => this.updateProductValue(value));

    return newLine;
}

private updateProductValue(object): void {
    const quantity = parseFloat(object.quantity);
    const value_total = parseFloat(object.value_total);
    const formArray = this.purchaseForm.controls['products'] as FormArray;
    
    object.value_unit = value_total / quantity;
    formArray.at(object.index).patchValue(object);
}
Run Code Online (Sandbox Code Playgroud)

当我更改数量或总价值的输入时,我需要更新该特定产品的单位价值。问题是,当我进行此计算并更新值时,它检测到新值更改并再次执行该函数,这会创建一个循环。

我在这里做错了什么?或者我需要做什么来防止这种行为?除了这个循环之外,其他一切都按预期工作。

小智 5

尝试像这样更改最后一行:

formArray.at(object.index).patchValue(object, { emitEvent: false, onlySelf: true });
Run Code Online (Sandbox Code Playgroud)