angular的表单
angular的表单分为两种,一种是响应式的表单,另一种是模板驱动表单。使用\'@angular/forms\'库中的FormGroup, FormControl,FormArray,FormBuilder 等类构建出的数据对象就是响应式的表单,在响应式的表单中,我们会在数据源里面进行各种操作,像添加校验等,在html文件中使用 formGroup,formGroupName,formControlName等将数据和视图进行绑定(需要引入ReactiveFormsModule)。
//ts
profileForm = new FormGroup({
firstName: new FormControl(\'\'),
lastName: new FormControl(\'\'),
address: new FormGroup({
street: new FormControl(\"\"),
city: new FormControl(\"\"),
state: new FormControl(\"\"),
zip: new FormControl(\"\")
})
})
//html
<input type=\"text\" formControlName=\"firstName\">
模板驱动的表单是我们实例化好一个类的数据之后,在html中使用 NgForm 指令后将数据和表单进行绑定,使用[(ngModel)]来将表单的数据和和视图进行双向绑定,NgForm 指令为 form 增补了一些额外特性。 它会控制那些带有 ngModel 指令和 name 属性的元素,监听他们的属性。
//html
<form #heroForm=\"ngForm\" appIdentityRevealed (ngSubmit)=\" ()\">
<div >
<label for=\"name\">Name</label>
<input type=\"text\" id=\"name\" required [(ngModel)]=\"model.name\" [ngModelOptions]=\"{updateOn: \'blur\'}\" name=\"name\">
<div >
<label for=\"power\">Hero Power</label>
<select id=\"power\" class=\"form-control\" required [(ngModel)]=\"model.power\" name=\"power\">
<option *ngFor=\"let power of powers\" [value]=\"power\">{{power}}</option>
</select>
</div>
<button type=\"button\" (click)=\"newHero();heroForm.reset()\">
New Hero
</button>
<button type=\"submit\" [disabled]=\"!heroForm.form.valid\">
Submit
</button>
</form>
//ts
model = new Hero(18, \'Dr IQ\', this.powers[0], \'Chuck Overstreet\');
响应式表单
响应式的表单中,添加校验逻辑是以返回一个ValidatorFn类的函数实现的
function forbiddenNameValidator(value: string): ValidatorFn {
return (control: AbstractControl): { [key: string]: any } | null => {
const rule = new RegExp(value,\'i\');//设定验证规则,i是忽略大小写的意思
const result = rule.test(control.value);//control.value是输入框的值,forbidden是正则结果
return result ? { \'forbiddenName\': { value: control.value } } : null;//如果匹配成功,则返回对象
};
}
firstName:[\'\',[forbiddenNameValidator(\'bob\')]],
模板驱动表单
模板驱动的表单中,添加校验逻辑是以指令方式实现的
//ts
import { Directive, Input } from \'@angular/core\';
import { AbstractControl, NG_VALIDATORS, Validator, ValidatorFn, Validati s } from \'@angular/forms\';
import { FormGroup } from \'@angular/forms\';
export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {
return (control: AbstractControl): { [key: string]: any } | null => {
const forbidden = nameRe.test(control.value);
return forbidden ? { \'forbiddenName\': { value: control.value } } : null;
};
}
@Directive({
selector: \'[appForbiddenName]\',
providers: [{ provide: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true }]
})
export class ForbiddenValidatorDirective implements Validator {
@Input(\'appForbiddenName\') forbiddenName: string;
validate(control: AbstractControl): { [key: string]: any } | null {
return this.forbiddenName ? forbiddenNameValidator(new RegExp(this.forbiddenName, \'i\'))(control)
: null;
}
}
//html
<input type=\"text\" required [(ngModel)]=\"model.name\" name=\"name\" appForbiddenName=\"bob\">
总结
响应式表单需要引入ReactiveFormsModule模块,在使用时需要引入大量的指令,使用麻烦,但是添加校验逻辑简单,用户可以动态添加新的输入域,适合非固定的表单。
模板驱动的表单中,表单的数据生成很简单,在html中需要双向绑定,并且配上name属性,添加校验时要是用指令的方式,适合固定的输入表单。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
继续阅读与本文标签相同的文章
上一篇 :
MySQL数据库性能优化之三
下一篇 :
Python读书笔记5
-
Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了
2026-05-19栏目: 教程
-
Spring Cloud和Dubbo,孰优孰劣
2026-05-19栏目: 教程
-
Java锁---偏向锁、轻量级锁、自旋锁、重量级锁
2026-05-19栏目: 教程
-
CTF从入门到提升(七)insert 等数据表相关操作注入及例题分享
2026-05-19栏目: 教程
-
合肥新闻联播:“NEXT创新大会”合肥重磅开年 聚焦“新经济”赋能产业升级
2026-05-19栏目: 教程
