如何在 Angular 2 中添加表单验证模式?
How to add form validation pattern in Angular 2?
我有一个简单的表单,需要验证输入的开头和结尾是否不是 space。
在HTML5,我会这样做:
<input type="text" pattern="^(?!\s|.*\s$).*$">
新 Angular 2 ngControl 指令中正确的 属性 验证模式是什么?官方 Beta API 仍然缺少关于此问题的文档。
您可以使用 FormBuilder 构建表单,因为它让您可以更灵活地配置表单。
export class MyComp {
form: ControlGroup;
constructor(@Inject()fb: FormBuilder) {
this.form = fb.group({
foo: ['', MyValidators.regex(/^(?!\s|.*\s$).*$/)]
});
}
然后在您的模板中:
<input type="text" ngControl="foo" />
<div *ngIf="!form.foo.valid">Please correct foo entry !</div>
也可以自定义ng-invalid CSS class.
由于实际上没有正则表达式验证器,您必须自己编写。这是一个简单的函数,它在输入中进行控制,return 如果有效则为 null,如果无效则为 StringMap。
export class MyValidators {
static regex(pattern: string): Function {
return (control: Control): {[key: string]: any} => {
return control.value.match(pattern) ? null : {pattern: true};
};
}
}
希望对你有所帮助。
自版本 2.0.0-beta.8 (2016-03-02) 起,Angular 现在包含一个 Validators.pattern
正则表达式验证器。
现在,您不需要使用 FormBuilder
和所有这些复杂的变量 angular 东西。我从中添加了更多详细信息(Angular 2.0.8 - 3march2016):
https://github.com/angular/angular/commit/38cb526
回购示例:
<input [ngControl]="fullName" pattern="[a-zA-Z ]*">
我对其进行了测试并且它有效 :) - 这是我的代码:
<form (ngSubmit)="onSubmit(room)" #roomForm='ngForm' >
...
<input
id='room-capacity'
type="text"
class="form-control"
[(ngModel)]='room.capacity'
ngControl="capacity"
required
pattern="[0-9]+"
#capacity='ngForm'>
替代方法(2017 年 6 月更新)
验证仅在服务器端进行。如果出现问题,则服务器 return 错误代码例如 HTTP 400 和响应主体中的以下 json 对象(例如):
this.err = {
"capacity" : "too_small"
"filed_name" : "error_name",
"field2_name" : "other_error_name",
...
}
在 html 模板中,我使用单独的标签(div/span/small 等)
<input [(ngModel)]='room.capacity' ...>
<small *ngIf="err.capacity" ...>{{ translate(err.capacity) }}</small>
如果 'capacity' 中有错误,则带有消息翻译的标签将可见。这种方法有以下优点:
- 很简单
- 避免在前端重复后端验证代码(对于正则表达式验证,这可以防止或复杂化 ReDoS 攻击)
- 控制显示错误的方式(例如
<small>
标签)
- 后端 return error_name 很容易在前端翻译成合适的语言
当然,如果前端需要验证,我有时会例外(例如,retypePassword
注册字段永远不会发送到服务器)。
逐步自定义验证
Html 模板
<form [ngFormModel]="demoForm">
<input
name="NotAllowSpecialCharacters"
type="text"
#demo="ngForm"
[ngFormControl] ="demoForm.controls['spec']"
>
<div class='error' *ngIf="demo.control.touched">
<div *ngIf="demo.control.hasError('required')"> field is required.</div>
<div *ngIf="demo.control.hasError('invalidChar')">Special Characters are not Allowed</div>
</div>
</form>
组件App.ts
import {Control, ControlGroup, FormBuilder, Validators, NgForm, NgClass} from 'angular2/common';
import {CustomValidator} from '../../yourServices/validatorService';
在class之下
定义
demoForm: ControlGroup;
constructor( @Inject(FormBuilder) private Fb: FormBuilder ) {
this.demoForm = Fb.group({
spec: new Control('', Validators.compose([Validators.required, CustomValidator.specialCharValidator])),
})
}
在{../../yourServices/validatorService.ts}
export class CustomValidator {
static specialCharValidator(control: Control): { [key: string]: any } {
if (control.value) {
if (!control.value.match(/[-!$%^&*()_+|~=`{}\[\]:";#@'<>?,.\/]/)) {
return null;
}
else {
return { 'invalidChar': true };
}
}
}
}
我使用 Angular 4.0.1 的解决方案:仅显示所需 CVC 输入的 UI - 其中 CVC 必须正好是 3 位数字:
<form #paymentCardForm="ngForm">
...
<md-input-container align="start">
<input #cvc2="ngModel" mdInput type="text" id="cvc2" name="cvc2" minlength="3" maxlength="3" placeholder="CVC" [(ngModel)]="paymentCard.cvc2" [disabled]="isBusy" pattern="\d{3}" required />
<md-hint *ngIf="cvc2.errors && (cvc2.touched || submitted)" class="validation-result">
<span [hidden]="!cvc2.errors.required && cvc2.dirty">
CVC is required.
</span>
<span [hidden]="!cvc2.errors.minlength && !cvc2.errors.maxlength && !cvc2.errors.pattern">
CVC must be 3 numbers.
</span>
</md-hint>
</md-input-container>
...
<button type="submit" md-raised-button color="primary" (click)="confirm($event, paymentCardForm.value)" [disabled]="isBusy || !paymentCardForm.valid">Confirm</button>
</form>
无需制作验证模式,您可以轻松地 trim 使用这些 modules.Try 开始和结束空格。
https://www.npmjs.com/package/ngx-trim-directive
https://www.npmjs.com/package/ng2-trim-directive
谢谢。
我有一个简单的表单,需要验证输入的开头和结尾是否不是 space。
在HTML5,我会这样做:
<input type="text" pattern="^(?!\s|.*\s$).*$">
新 Angular 2 ngControl 指令中正确的 属性 验证模式是什么?官方 Beta API 仍然缺少关于此问题的文档。
您可以使用 FormBuilder 构建表单,因为它让您可以更灵活地配置表单。
export class MyComp {
form: ControlGroup;
constructor(@Inject()fb: FormBuilder) {
this.form = fb.group({
foo: ['', MyValidators.regex(/^(?!\s|.*\s$).*$/)]
});
}
然后在您的模板中:
<input type="text" ngControl="foo" />
<div *ngIf="!form.foo.valid">Please correct foo entry !</div>
也可以自定义ng-invalid CSS class.
由于实际上没有正则表达式验证器,您必须自己编写。这是一个简单的函数,它在输入中进行控制,return 如果有效则为 null,如果无效则为 StringMap。
export class MyValidators {
static regex(pattern: string): Function {
return (control: Control): {[key: string]: any} => {
return control.value.match(pattern) ? null : {pattern: true};
};
}
}
希望对你有所帮助。
自版本 2.0.0-beta.8 (2016-03-02) 起,Angular 现在包含一个 Validators.pattern
正则表达式验证器。
现在,您不需要使用 FormBuilder
和所有这些复杂的变量 angular 东西。我从中添加了更多详细信息(Angular 2.0.8 - 3march2016):
https://github.com/angular/angular/commit/38cb526
回购示例:
<input [ngControl]="fullName" pattern="[a-zA-Z ]*">
我对其进行了测试并且它有效 :) - 这是我的代码:
<form (ngSubmit)="onSubmit(room)" #roomForm='ngForm' >
...
<input
id='room-capacity'
type="text"
class="form-control"
[(ngModel)]='room.capacity'
ngControl="capacity"
required
pattern="[0-9]+"
#capacity='ngForm'>
替代方法(2017 年 6 月更新)
验证仅在服务器端进行。如果出现问题,则服务器 return 错误代码例如 HTTP 400 和响应主体中的以下 json 对象(例如):
this.err = {
"capacity" : "too_small"
"filed_name" : "error_name",
"field2_name" : "other_error_name",
...
}
在 html 模板中,我使用单独的标签(div/span/small 等)
<input [(ngModel)]='room.capacity' ...>
<small *ngIf="err.capacity" ...>{{ translate(err.capacity) }}</small>
如果 'capacity' 中有错误,则带有消息翻译的标签将可见。这种方法有以下优点:
- 很简单
- 避免在前端重复后端验证代码(对于正则表达式验证,这可以防止或复杂化 ReDoS 攻击)
- 控制显示错误的方式(例如
<small>
标签) - 后端 return error_name 很容易在前端翻译成合适的语言
当然,如果前端需要验证,我有时会例外(例如,retypePassword
注册字段永远不会发送到服务器)。
逐步自定义验证
Html 模板
<form [ngFormModel]="demoForm">
<input
name="NotAllowSpecialCharacters"
type="text"
#demo="ngForm"
[ngFormControl] ="demoForm.controls['spec']"
>
<div class='error' *ngIf="demo.control.touched">
<div *ngIf="demo.control.hasError('required')"> field is required.</div>
<div *ngIf="demo.control.hasError('invalidChar')">Special Characters are not Allowed</div>
</div>
</form>
组件App.ts
import {Control, ControlGroup, FormBuilder, Validators, NgForm, NgClass} from 'angular2/common';
import {CustomValidator} from '../../yourServices/validatorService';
在class之下 定义
demoForm: ControlGroup;
constructor( @Inject(FormBuilder) private Fb: FormBuilder ) {
this.demoForm = Fb.group({
spec: new Control('', Validators.compose([Validators.required, CustomValidator.specialCharValidator])),
})
}
在{../../yourServices/validatorService.ts}
export class CustomValidator {
static specialCharValidator(control: Control): { [key: string]: any } {
if (control.value) {
if (!control.value.match(/[-!$%^&*()_+|~=`{}\[\]:";#@'<>?,.\/]/)) {
return null;
}
else {
return { 'invalidChar': true };
}
}
}
}
我使用 Angular 4.0.1 的解决方案:仅显示所需 CVC 输入的 UI - 其中 CVC 必须正好是 3 位数字:
<form #paymentCardForm="ngForm">
...
<md-input-container align="start">
<input #cvc2="ngModel" mdInput type="text" id="cvc2" name="cvc2" minlength="3" maxlength="3" placeholder="CVC" [(ngModel)]="paymentCard.cvc2" [disabled]="isBusy" pattern="\d{3}" required />
<md-hint *ngIf="cvc2.errors && (cvc2.touched || submitted)" class="validation-result">
<span [hidden]="!cvc2.errors.required && cvc2.dirty">
CVC is required.
</span>
<span [hidden]="!cvc2.errors.minlength && !cvc2.errors.maxlength && !cvc2.errors.pattern">
CVC must be 3 numbers.
</span>
</md-hint>
</md-input-container>
...
<button type="submit" md-raised-button color="primary" (click)="confirm($event, paymentCardForm.value)" [disabled]="isBusy || !paymentCardForm.valid">Confirm</button>
</form>
无需制作验证模式,您可以轻松地 trim 使用这些 modules.Try 开始和结束空格。
https://www.npmjs.com/package/ngx-trim-directive https://www.npmjs.com/package/ng2-trim-directive
谢谢。