角度表单仅在表单有效时获取字段值

时间:2019-11-10 07:54:18

标签: angular angular-forms

我正在使用角度形式,并在其字段中进行了一些验证。现在,我想在字段更改时获取字段的值,但前提是表单处于有效状态。

<form [formGroup]="AddEditform" novalidate autocomplete="off">
    <mat-form-field appearance="outline">
        <textarea matInput name="user" formControlName="users" id="user">
        </textarea>
        <mat-error
            *ngIf="!AddEditform.valid && AddEditform.get('users').hasError('maxlength')"
        >
            Exceeded maximum length
        </mat-error>
    </<mat-form-field>
</form>
AddEditform: FormGroup;

constructor(
  private fb: FormBuilder,
) { }

ngOnInit() {

  this.AddEditform = this.fb.group({
    users: [
      '',
      [
        Validators.maxLength(100)
      ],
    ],
  });

  this.AddEditform.get('users').valueChanges.subscribe(data => {
    if (this.AddEditform.valid) {
      console.log(data);
    }      
  });
}

当前,将一直打印值,直到发生首次违反为止。在这种情况下,直到第101个字符。在那之后,我没有任何价值。但是为什么我会得到第一个违规价值?

2 个答案:

答案 0 :(得分:1)

updateValueAndValidity的源代码来看,我的猜测是子窗体控件的valueChanges事件在其父控件更新之前发生。

尝试保留对用户控件的引用,并检查其自己的valid标志,而不是父标志。

ngOnInit() {
    this.UsersControl = this.fb.control('', [Validators.maxLength(100)]);
    this.AddEditform = this.fb.group({
        users: this.UsersControl
    });

    this.UsersControl.valueChanges.subscribe(data => {
        if (this.UsersControl.valid) {
            console.log(data);
        }      
    });
}

要么,要么订阅整个表单valueChanges事件。

ngOnInit() {
    this.AddEditform = this.fb.group({
        users: ['', [Validators.maxLength(100)]]
    });

    this.AddEditForm.valueChanges.subscribe(data => {
        if (this.AddEditForm.valid) {
            console.log(data['users']);
        }      
    });
}

答案 1 :(得分:0)

您也可以使用以下代码:

this.AddEditform.get('users').valueChanges.subscribe(data => {
  setTimeout(() => {
    if (this.AddEditform.valid) {
      console.log(data);
    }
  }, 0);
});