Angular 4 多个字段的表单验证
Angular 4 form validation on multiple fields
编辑:
我想要实现的是对单个 formControl 而不是整个表单的验证。验证器应检查所有原子字段,如门牌号、街道等,然后使 google 地图输入控件无效。
我正在编写一个带有 Google 地图自动完成功能的表单。
用户应在触发 Google 地图自动完成逻辑的输入字段中输入地址。选择地址后,回调函数会选择街道、门牌号等,并使用 API 结果填写所需的地址数据字段。
显示其他表单元素但只读,因此我们始终获得有效数据并可以对输入执行验证。
问题是我的验证器没有触发输入字段。主输入字段始终有效,不会出现 ng-invalid class。
@Component({
selector: 'my-app',
styles: [`
.ng-valid {
border:#0ff;
}
.ng-invalid {
border:#f00;
}
`],
template: `
<form [formGroup]="testForm">
<input type="text" formControlName="address">
<input type="text" formControlName="tel">
<input type="text" formControlName="mail">
</form>
`
})
export class AppComponent {
testForm:FormGroup;
constructor(private fb: FormBuilder) {
this.testForm = this.fb.group({
address:['', myValidator],
tel:[''],
mail:['']
}, {
validator: myValidator("tel", "mail")
});
}
}
export const myValidator = (field1, field2): ValidatorFn => (control: AbstractControl) => {
if(control.get(field1).value=="test" && control.get(field2).value=="test2") {
return null;
}
return { myValidator: { valid: false } };
}
我把它做了一个 punker,所以你可以看到它的实际效果:
https://plnkr.co/edit/2kncVT6thQTU1HMCmyTy?p=preview
我认为您的验证是正确的,您只需要像这样显示验证消息
<form [formGroup]="testForm">
<input type="text" formControlName="address">
<input type="text" formControlName="tel">
<input type="text" formControlName="mail">
</form>
<span *ngIf="!testForm.errors.myValidator">Incorrect<span>
并在您的验证中使用此
if(control.get(field1).value=="test" && control.get(field2).value=="test2") {
return { myValidator: true }
}
return { myValidator: false };
您的表单和验证似乎有效。我更新了你的 plunker 并在你的模板中添加了两个 div:
<form [formGroup]="testForm">
<input type="text" formControlName="address">
<input type="text" formControlName="tel">
<input type="text" formControlName="mail">
</form>
<div *ngIf="testForm.valid">Your form is valid! yay!</div>
<div *ngIf="testForm.invalid">Your form is invalid!</div>
这是更新后的内容:
编辑: 我想要实现的是对单个 formControl 而不是整个表单的验证。验证器应检查所有原子字段,如门牌号、街道等,然后使 google 地图输入控件无效。
我正在编写一个带有 Google 地图自动完成功能的表单。 用户应在触发 Google 地图自动完成逻辑的输入字段中输入地址。选择地址后,回调函数会选择街道、门牌号等,并使用 API 结果填写所需的地址数据字段。 显示其他表单元素但只读,因此我们始终获得有效数据并可以对输入执行验证。
问题是我的验证器没有触发输入字段。主输入字段始终有效,不会出现 ng-invalid class。
@Component({
selector: 'my-app',
styles: [`
.ng-valid {
border:#0ff;
}
.ng-invalid {
border:#f00;
}
`],
template: `
<form [formGroup]="testForm">
<input type="text" formControlName="address">
<input type="text" formControlName="tel">
<input type="text" formControlName="mail">
</form>
`
})
export class AppComponent {
testForm:FormGroup;
constructor(private fb: FormBuilder) {
this.testForm = this.fb.group({
address:['', myValidator],
tel:[''],
mail:['']
}, {
validator: myValidator("tel", "mail")
});
}
}
export const myValidator = (field1, field2): ValidatorFn => (control: AbstractControl) => {
if(control.get(field1).value=="test" && control.get(field2).value=="test2") {
return null;
}
return { myValidator: { valid: false } };
}
我把它做了一个 punker,所以你可以看到它的实际效果: https://plnkr.co/edit/2kncVT6thQTU1HMCmyTy?p=preview
我认为您的验证是正确的,您只需要像这样显示验证消息
<form [formGroup]="testForm">
<input type="text" formControlName="address">
<input type="text" formControlName="tel">
<input type="text" formControlName="mail">
</form>
<span *ngIf="!testForm.errors.myValidator">Incorrect<span>
并在您的验证中使用此
if(control.get(field1).value=="test" && control.get(field2).value=="test2") {
return { myValidator: true }
}
return { myValidator: false };
您的表单和验证似乎有效。我更新了你的 plunker 并在你的模板中添加了两个 div:
<form [formGroup]="testForm">
<input type="text" formControlName="address">
<input type="text" formControlName="tel">
<input type="text" formControlName="mail">
</form>
<div *ngIf="testForm.valid">Your form is valid! yay!</div>
<div *ngIf="testForm.invalid">Your form is invalid!</div>
这是更新后的内容: