私は次のコードを持っています
<form #createForm="ngForm">
<mat-form-field>
<mat-select placeholder="Favorite food"
matInput
[ngModel]
food="food"
#food="ngModel" required>
<mat-option *ngFor="let food of foods" [value]="food.value">
{{ food.viewValue }}
</mat-option>
</mat-select>
</mat-form-field>
</form>
<button [disabled]="!createForm.valid">submit</button>
「選択」は必須フィールドであるため、フォームのレンダリング時に「送信」ボタンを無効にする必要があります。ただし、フォームが表示されると、「送信」ボタンが有効になります。何が問題ですか?
これは、(a)name
属性を使用し、(b)双方向のngModel
バインディング構文を使用するときに機能します。
つまり、これの代わりに
_<mat-select placeholder="Favorite food" matInput [ngModel] food="food" #food="ngModel" required>
_
これを使って:
<mat-select name="food" placeholder="Favorite food" [(ngModel)]="food" required>
mat-select
で必須フィールド検証が機能する唯一の方法は、リアクティブフォーム検証を使用することです。 TypeScriptファイルにそれぞれのコンポーネントをインポートするだけです:
import {FormControl, Validators} from '@angular/forms';
HTMLファイル:
ngModel
参照を削除します
<mat-form-field>
<mat-select placeholder="Favorite food"
matInput [formControl]="foodControl"
required>
<mat-option *ngFor="let food of foods" [value]="food.value">
{{ food.viewValue }}
</mat-option>
</mat-select>
</mat-form-field>
これは、必須のフィールド検証で機能します。さらに検証したい場合は、TypeScriptファイルのform
にアクセスすることになります。 form
検証を行うオプションがないというのは奇妙なことですが、これが機能する唯一の方法です。
angular 5のリアクティブフォームを使用して検証します。 これを参照
*** componenet.ts *******
import { FormControl, Validators, FormBuilder, FormGroup, ReactiveFormsModule, NgForm } from '@angular/forms';
export class Test implements OnInit{
foodform:FormGroup;
constructor(){}
ngOnInit() {
// create form group of controls
this.foodform = new FormGroup({
favoriteFood: new FormControl('', [Validators.required])
});
}
}
**** Component.html ************
<form #createForm="ngForm" [formGroup]="foodform ">
<mat-form-field>
<mat-select placeholder="Favorite food"
matInput
[ngModel]
food="food"
#food="ngModel" formControlName="favoriteFood">
<mat-option *ngFor="let food of foods" [value]="food.value" >
{{ food.viewValue }}
</mat-option>
</mat-select>
<mat-error *ngIf="foodform.controls['favoriteFood'].hasError('required') && foodform.controls['favoriteFood'].pristine">
Required Message
</mat-error>
</mat-form-field>
</form>
つかいます [formGroup]
およびformControlName
をHTMLフォームに追加します。
これは私のために働いた:あなたのアプリモジュールにReactiveFormsModuleをインポートする
import { ReactiveFormsModule } from '@angular/forms';
@NgModuleデコレータに依存関係を追加します
元の質問の下のdanger89のコメントを見てください。名前属性がありません。例えば:
<form #createForm="ngForm" (ngSubmit)="submitFunction(createForm)">
<mat-form-field>
<mat-select
placeholder="Favorite food"
ngModel
name="food"
required
>
<mat-option *ngFor="let food of foods" [value]="food.value">
{{ food.viewValue }}
</mat-option>
</mat-select>
</mat-form-field>
<button type="submit" [disabled]="!createForm.valid">submit</button>
</form>
Name属性のため、フォームを送信すると、food.valueがcreateForm.value.foodで見つかるようになりました。