【问题标题】:Angular removing Validators.min from form control validationAngular 从表单控件验证中删除 Validators.min
【发布时间】:2022-01-14 03:07:28
【问题描述】:

我有一个包含 2 个字段的表单:

  • includeValidation,一个选择下拉菜单(2 个选项):有验证,没有验证
  • 金额,输入数字字段

根据第一个下拉菜单,我在第二个字段中有验证器:Validators.required、Validators.min(0.1)。

我正在尝试使用 clearValidators() 来删除验证,但它只删除了所需的而不是 min(0.1)

当 includeValidation == “没有验证”时如何删除 min(0.1)

code on stackblitz

formtest.ts

  ngOnInit(): void {
    this.initForm();
    this.initValueChanges();
  }

  initForm(): void {
    this.addForm = this.formBuilder.group({
      includeValidation: [''],
      amount: [0, [Validators.required, Validators.min(0.1)]]
    });
  }

  initValueChanges() {
    this.addForm.get('includeValidation').valueChanges.subscribe((value) => {
      if(value === 'with validation') {
        this.addForm.get('amount').setValidators([Validators.required, Validators.min(0.1)]);
        
      } else if(value === 'without validation') {
        this.addForm.get('amount').setValue(0);
        this.addForm.get('amount').clearValidators();
      }
    });
  }
  
    previewSaveButton() {
        this.addForm.get('amount').updateValueAndValidity();

        if(this.addForm.valid) {
        
        }
    }

formtest.html

  <form novalidate role="form" name="addForm" [formGroup]="addForm">
    <div class="row">
      <div class="col-md-12">
        <h5>General</h5>
        <div class="form-group"><label>include Validation</label>
          <select name="includeValidation" class="form-control" formControlName="includeValidation">
            <option></option>
            <option value="with validation">with validation</option>
            <option value="without validation">without validation</option>
          </select>
        </div>
        <div class="form-group"><label>amount</label>
          <input name="amount" type="text" class="form-control" formControlName="amount">
        </div>
      </div>
    </div>
    <hr />
    <div>
      <div class="d-flex justify-content-end">
        <button type="submit" (click)="previewSaveButton()">Next</button>
      </div>
    </div>
  </form>

【问题讨论】:

    标签: angular angular-reactive-forms angular-forms reactive-forms angular2-form-validation


    【解决方案1】:

    无论何时在运行时添加或删除验证器,都必须显式调用 updateValueAndValidity()

    来自docs

    在运行时添加或删除验证器时,必须调用 updateValueAndValidity() 以使新验证生效。

    试试这个:

    initValueChanges() {
        this.addForm.get('includeValidation').valueChanges.subscribe((value) => {
          if(value === 'with validation') {
            this.addForm.get('amount').setValidators([Validators.required, Validators.min(0.1)]);
            
          } else if(value === 'without validation') {
            this.addForm.get('amount').setValue(0);
            this.addForm.get('amount').clearValidators();
          }
          this.addForm.get('amount').updateValueAndValidity();  // <-- added this line
        });
      }
    

    【讨论】:

    • 所以我离开 updateValueAndValidity 直到 previewSaveButton 的原因是因为一旦 includeValidation 被更改。它立即将金额标记为无效。但是,数量应该只在调用 previewSaveButton 时标记为无效
    • 我正在尝试使用 clearValidators() 来删除验证,但它只删除了必需的而不是 min(0.1) 你为什么会有这种感觉? clearValidators() 确实删除了所有验证器,但要使其生效updateValueAndValidity 需要被调用。您在清除之前手动将值设置为 0,因此它满足 required 验证器。如果您将值设置为 1,那么它将满足两个验证器。
    • @helloworld 您可以在else-if 块内调用updateValueAndValidity,而不是在其外部,如答案所示,但要更新有效性,需要调用该方法。
    • 我不喜欢将 updateValueAndValidity 放在 else-if 中的建议,因为 setValidators 也需要它
    • clearValidators() 确实删除了所有验证器,但为了反映表单控件的有效性,需要调用 updateValueAndValidity。 previewSaveButton 中的updateValueAndValidity 应该更新有效性,如果includeValidation 设置为“无验证”,则amount 表单控件应该是有效的。如果不是这种情况,那么您能否在Stackblitz 提供最小的可重复示例?
    猜你喜欢
    • 2018-02-04
    • 2020-06-05
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多