【问题标题】:Update Value of Angular Reactive Form disabled field based on other Form Controls根据其他表单控件更新 Angular Reactive Form 禁用字段的值
【发布时间】:2018-08-03 19:30:16
【问题描述】:

我在 Angular 中使用反应式表单,并且有一个禁用的表单控件,该控件是根据其他字段/表单控件的值计算的。当它的依赖字段的值发生变化时,如何更新该禁用字段的值。计算正在运行,但我需要它来订阅其他字段的更改。我创建 FormGroup 的函数如下所示:

createBasket(basket: any) {
    return new FormGroup({
      length: new FormControl(basket.length),
      width: new FormControl(basket.width),
      height: new FormControl(basket.height),
      crossSectArea: new FormControl({value: basket.length * basket.width * basket.height, disabled: true}, Validators.required)
    });
  }

不确定这是否会改变解决方案,但我也在使用 FormArray 来创建表单组实例的数组。

【问题讨论】:

    标签: angular typescript angular-reactive-forms angular-forms angular-validation


    【解决方案1】:

    FormControl API 公开了一个valueChanges observable,您可以订阅它,然后使用setValue 方法在订阅块中强制设置另一个表单控件的值:

    ngOnInit() {
      this.basketForm = createBasket(basket);
      const length = this.basketForm.get('length');
      const width = this.basketForm.get('width');
      length.valueChanges.subscribe(val => {
        width.setValue(val * 2);
      });
    }
    

    工作示例:https://stackblitz.com/edit/interdependent-form-controls

    【讨论】:

    • 感谢 vincecampanale 的详细回答。我在其他地方使用自定义验证器,我只是觉得必须有一个更简单的解决方案来解决我的问题,因为我不需要验证任何字段,我只需要在其他字段更改时更新字段的值(计算)。
    • 我第一次完全看错了你的问题,我的错!更新了我的答案,因此它实际上回答了您的问题。
    • 哈哈,不用担心,谢谢!我唯一的问题是如何在 FormArray 中实现它?
    • 很高兴为您提供帮助,我不确定如何根据您提供的代码回答您的问题。如果要在数组中设置控件的值,可以使用FormArray 上的setControl。如果要设置数组的值,可以使用上面显示的setValue 方法。如果您在问题中显示的组是数组的成员,您可以遍历该数组并使用我提到的方法。这取决于您的代码和您要执行的操作,但valueChangessetValue 的通用组合无论如何都可以解决问题。
    • 这里是FormArray API 文档的链接:angular.io/api/forms/FormArray。这些信息有帮助吗?
    猜你喜欢
    • 2020-09-30
    • 2019-04-23
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多