我要从Angular 5迁移到Angular 7,我发现在Angular6中不推荐在同一元素中使用ngmodel和formcontrolName,而在7中将其删除。 >
html:
<div class="form-group col-md-6">
<label class="required"> User Names
</label>
<mat-form-field >
<mat-chip-list class="form-control form-control-sm"
[ngClass]="{'is-invalid':form.controls.names.invalid && (form.controls.names.touched || form.controls.names.dirty) }"
#chipList3>
<mat-chip *ngFor="let local of form.get('names').value" [removable]="removable"
(remove)="remove_names(local)">
{{local}}
<mat-icon matChipRemove *ngIf="removable">cancel</mat-icon>
</mat-chip>
<input [matChipInputFor]="chipList3"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes" [matChipInputAddOnBlur]="addOnBlur"
(matChipInputTokenEnd)="add_names($event)" />
</mat-chip-list>
</mat-form-field>
</div>
在迁移到有角度的7之前,我只需要在输入标签中使用formControlName
<div class="form-group col-md-6">
<label class="required"> User Names
</label>
<mat-form-field >
<mat-chip-list class="form-control form-control-sm"
[ngClass]="{'is-invalid':form.controls.names.invalid && (form.controls.names.touched || form.controls.names.dirty) }"
#chipList3>
<mat-chip *ngFor="let local of user.names" [removable]="removable"
(remove)="remove_names(local)">
{{local}}
<mat-icon matChipRemove *ngIf="removable">cancel</mat-icon>
</mat-chip>
<input [matChipInputFor]="chipList3"
formControlName="names"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes" [matChipInputAddOnBlur]="addOnBlur"
(matChipInputTokenEnd)="add_names($event)" />
</mat-chip-list>
</mat-form-field>
</div>
当用户将名称推入列表时,我会执行所有自定义验证,但我想检查是否存在该名称,因此我使用Validators.required,但由于我使用formcontrol值本身来显示列表,无法在模板中对formControlName进行任何引用
TS:
user :FormGroup =this.fb.group({
names:[[], [Validators.required]],
id:0
});
现在,即使formControl中有值也不能满足Validators.required
花时间研究之后,我发现添加了这个
this.form.controls['names'].updateValueAndValidity()
需要Validators.required,但现在出现此错误
Error: No value accessor for form control with name: 'names'
答案 0 :(得分:0)
我知道您的问题是关于角形材料的,但是您可以简单地用我的代码替换,但这是通过反应性表单技术和引导程序4来显示验证的验证表单控制输入字段的最佳方法。首先,您需要为表单编写一些代码:在html部分:
<form [formGroup]="myForm">
<div class="form-group">
<label for="name">first Name: </label>
<input type="text" class="form-control" formControlName="firstName" id="name">
<div *ngIf="firstName.touched && firstName.invalid" class="alert alert-danger">
<div *ngIf="firstName.errors.required">filling name is required!</div>
</div>
</div>
</form>
在ts文件中,您应该实现执行验证的逻辑。
在ts文件中:
myForm = new FormGroup({
'firstName':new FormControl('',Validators.required)
})
//getter method
get firstName(){
this.myForm.get('firstName');
}
现在您可以看到验证正在运行。现在为输入字段赋予样式以在无效输入周围显示红色边框,只需转到component的css文件并将此类添加到css文件中即可:
/// invalid
.form-control.ng-touched.ng-invalid{border:2px solid red;}
///valid
.form-control.ng-touched.ng-invalid{border:2px solid green;}
使用ng类不需要此技术。