代码之家  ›  专栏  ›  技术社区  ›  Muhammed Albarmavi

当窗体被禁用时,反应窗体有效属性返回false

  •  2
  • Muhammed Albarmavi  · 技术社区  · 6 年前

    我有这个简单的表单,用于创建和更新案例,因此对于创建案例,用户将输入数据并基于validatorsI获得 form.valid (对,错)。 在update case中,我只是从api获取数据,并将该值设置为表单,然后禁用表单;

    this.form = fb.group({
      name: ['', Validators.required],
      lastName: ['', Validators.required],
      address: [''],
    });
    

    所以当我禁用表单时,有效值总是 false ;

     ngOnInit() {
        this.form.patchValue({
          name: 'name',
          lastName: 'Last Name'
        });
    
        this.form.disable();
      }
    

    stackblitz example

    3 回复  |  直到 6 年前
        1
  •  4
  •   JB Nizet    6 年前

    这是正确的文件上说:

    控件在其状态有效时有效。

    身份证明文件上写着:

    控件的验证状态有四种可能的验证状态值:

    • 有效:此控件已通过所有验证检查。
    • 无效:此控件至少未通过一次验证检查。
    • 挂起:此控件正在进行验证检查。
    • 禁用:此控件不受验证检查的限制。

    您的表单已禁用,因此无效。

        2
  •  1
  •   Muhammed Albarmavi    6 年前

    如果表单被禁用,Valid将返回false,因此我找到了解决此问题的两种方法

    检查实例 valid 属性直接生成用于检查有效性的函数

     isFormValid() : boolean { 
        return this.form.disabled ? true : this.form.valid
      }
    

    模板

    <button [disabled]="!isFormValid()" (click)="update()">Update</button>
    

    不创建isFormValid函数的另一种方法

    <button [disabled]="!form.valid && form.disabled === false" (click)="update()">Update</button>
    
        3
  •  0
  •   Eric    5 年前

    如果不是所有的表单字段都被禁用,那么此时,在这种情况下,使用反应式表单的最佳解决方法是将这些字段标记为只读不完全一样,但这样你可以有一个一贯的行为。

    相关问题:

    https://github.com/angular/angular/issues/11447 https://github.com/angular/material2/issues/15399