微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 表单验证不是有角度的?

我想检查下拉列表是否为空.

需要显示所需的消息和

如果不为空,请启用提交按钮.

如果为空,请禁用提交按钮.下面是我的HTML

下面是我的HTML

<form  [formGroup]="myForm"  (ngSubmit)="save()" >
<mat-form-field>
  <mat-select formControlName="name" placeholder="Element List"  (selectionChange)="elementSelectionChange($event)" required>
    <mat-option *ngFor="let element of Elements" [value]="element.name">
      {{ element.name }}
    </mat-option>
  </mat-select>
  <mat-error *ngIf="myForm.hasError('required', 'name')">Please choose an name</mat-error>
</mat-form-field>
<mat-form-field>
  <mat-select  formControlName="symbol"  placeholder="Symbol List" required>
    <mat-option *ngFor="let element of selectedElementSymbol" [value]="element.symbol">
      {{ element.symbol }}
    </mat-option>
  </mat-select>
  <mat-error *ngIf="myForm.hasError('required', 'symbol')">Please choose an symbol</mat-error>
</mat-form-field>

<div mat-dialog-actions>

  <button mat-button (click)="onNoClick()">Cancel</button>
<button type="submit"  mat-button cdkFocusInitial>Add</button>
</div>
</form>

下面是我的组件

export class DialogoverviewExampleDialog {

  myForm: FormGroup;
  symbol = new FormControl('', Validators.required);
  name = new FormControl('', Validators.required);
  constructor(
    public dialogRef: MatDialogRef<DialogoverviewExampleDialog>,
    @Inject(MAT_DIALOG_DATA) public data: any,
    private formBuilder: FormBuilder) {

    this.myForm = this.formBuilder.group({
      name: [this.name],
      symbol: [this.symbol],
    });
  }

  save() {

    console.log(this.myForm.value);
  }

}

updated demo here

解决方法:

您当前正在将formcontrol分配给formcontrol,而您希望为表单控件分配值.下面是将表单控件名称分配给formcontrol名称

错误

name = new FormControl('', Validators.required);

this.myForm = this.formBuilder.group({
  'name': [this.name, Validators.required],
  // ...
});

所以相反,只需声明名称,使用值执行您想要的操作,然后将该值分配给表单控件…

正确:

name: string;

this.myForm = this.formBuilder.group({
  'name': [this.name, Validators.required],
  // ...
});

然后在提交按钮上添加[disabled] =“!myForm.valid”.

至于另一个问题,认情况下Angular材质不会显示错误消息,除非触摸了该字段,因此您需要有一个自定义错误状态匹配器,即使未触及该字段也会显示错误(如果这是您想要的):

import {ErrorStateMatcher} from '@angular/material/core';

export class MyErrorStateMatcher implements ErrorStateMatcher {
  isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
    return !!(control.invalid);
  }
}

并在您的TS中,声明错误状态匹配器:

matcher = new MyErrorStateMatcher();

并在模板中使用:

<mat-select formControlName="name" ... [errorStateMatcher]="matcher">

这是你的

StackBlitz

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐