18

我有以下代码

<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>

由于我希望“选择”是必填字段,因此在呈现表单时应该禁用“提交”按钮。但是,显示表单时会启用“提交”按钮。问题是什么?

4

6 回答 6

12

当我(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>

于 2018-06-29T02:41:07.250 回答
4

对于 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])
 });
}
}

**** 组件.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>

在您的 html 表单中使用[formGroup]和。formControlName

于 2018-03-29T05:16:20.077 回答
3

在 a 上进行必需字段验证的唯一方法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>

这适用于所需的字段验证。如果您想更多地验证,您最终将访问form打字稿文件中的 。奇怪的是没有选择进行form验证,这是我发现使它工作的唯一方法。

于 2018-04-16T18:28:20.023 回答
0

这对我有用: 在你的应用模块中导入 ReactiveFormsModule

import { ReactiveFormsModule } from '@angular/forms';

并在 @NgModule 装饰器中添加它的依赖项

于 2019-01-09T06:55:18.367 回答
0

我不知道自己做错了什么,但在使用 FormGroup 和 FormControl 时,我无法获得使用 Ang8 + Material8 和多选的任何解决方案。我最终做了以下解决方法。

首先,我在 mat-select 中添加了一个标签 #thisselect

然后我在提交按钮中测试了零长度的标签值

<form [formGroup]="bypartForm" (ngSubmit)="onSubmit()">
            <mat-form-field [hideRequiredMarker]="true">
                <mat-select #thisselect placeholder="Brands" formControlName="brands"
                    (selectionChange)="selectChanged($event)" multiple required>
                    <mat-option *ngFor="let brand of brandList" [value]="brand.name">{{brand.name}}</mat-option>
                </mat-select>
            </mat-form-field>
            <mat-form-field [hideRequiredMarker]="true">
                <input matInput autocomplete="off" placeholder="Part#" formControlName="part" required>
            </mat-form-field>
            <div class="form-buttons">
                <button mat-raised-button color="primary" type="submit" [disabled]="!bypartForm.valid || (thisselect.value != undefined && thisselect.value.length == 0)">Submit</button>
            </div>
        </form>
于 2019-12-02T15:33:19.027 回答
0

在您原来的问题下查看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 中找到。

于 2018-04-27T07:58:22.410 回答