即使表单未通过验证,组件加载时反应形式的Angular 7设置值也会启用保存按钮

ali*_*990 4 angular angular-reactive-forms angular6 angular7

我有以下问题。单击以检查堆栈闪电

我在构造函数中设置了反应形式:

this.formGroup = this.fb.group({
      'family_name_en': new FormControl('', Validators.required),
      'family_name_ar': new FormControl('', [Validators.required, Validators.pattern('[\u0600-\u06FF ]*')]),
      'unit_id': new FormControl({ value: '', disabled: true }, [Validators.required])
});
Run Code Online (Sandbox Code Playgroud)

而且ngOnInti(),我正在获取与关联的数据unit_id

当我将数据从平台迁移到另一个平台时,不建议使用阿拉伯语的姓氏,但现在是这样。因此,大多数数据将不使用阿拉伯文名称加载。

问题是该按钮始终处于启用状态,而我需要做的是,如果用户要更新此unit_id按钮,则他应该添加阿拉伯语名称,以便随后启用该按钮。

如果表单有效,则启用按钮在加载组件时不会造成伤害。

这是getData()获取数据并设置表单组控件值的方法:

ngOnInit() {
    this.getDataById();
}
Run Code Online (Sandbox Code Playgroud)

getDataById():

getDataById() {
    this.showSpinner = true;
    this.auth.getDataById(this.unit_id).subscribe(
      (data) => {
        if (data['info'][0]['total'] == 1) {
          this.noDataBool = false;
          this.showSpinner = false;
          this.family_name_en = data['info'][0]['hh_last_name_en'];
          this.formGroup.controls['family_name_en'].setValue(this.family_name_en);
          this.family_name_ar = data['info'][0]['hh_last_name_ar'];
          this.formGroup.controls['family_name_ar'].setValue(this.family_name_ar);
          this.unit_id = data['info'][0]['unit_id'];
          this.formGroup.controls['unit_id '].setValue(this.unit_id);
    }
}
Run Code Online (Sandbox Code Playgroud)

按钮:

<button mat-raised-button color="warn" (click)="updateData()" [disabled]="!formGroup.valid">
    <mat-icon>update</mat-icon>Update
</button>
Run Code Online (Sandbox Code Playgroud)

Sid*_*era 7

而不是FormControl通过controls在上直接访问formGroup,您应该get在它们上使用API。这将为您提供更多控制权并显着清理实现(尤其是在嵌套元素很深的情况下)。您可以像这样更改组件实现:

import { Component } from '@angular/core';
import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms';
import { Observable } from 'rxjs/Observable';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  formGroup: FormGroup;
  titleAlert: string = 'This field is required';
  post: any = '';
  family_name_en;
  family_name_ar;
  unit_id;
  constructor(private fb: FormBuilder) { }

  ngOnInit() {
    this.formGroup = this.fb.group({
      'family_name_en': new FormControl('', Validators.required),
      'family_name_ar': new FormControl('', [Validators.required, Validators.pattern('[\u0600-\u06FF ]*')]),
      'unit_id': new FormControl({ value: '', disabled: true }, [Validators.required])
    });
    this.getDataById();
  }

  getDataById() {
    let data: Array<any> = [
      'Ali', '', '123'
    ]
    this.family_name_en = data[0];
    this.formGroup.get('family_name_en').setValue(this.family_name_en);
    this.family_name_ar = data[1];
    this.formGroup.get('family_name_ar').setValue(this.family_name_ar);
    this.unit_id = data[2];
    this.formGroup.get('unit_id').setValue(this.unit_id);
  }

}
Run Code Online (Sandbox Code Playgroud)

这是供您参考的更新的StackBlitz。您可以通过在???其中输入“ Update”按钮来进行测试。键入Ali将使其保持禁用状态。