美文网首页
Angular2 响应式表单

Angular2 响应式表单

作者: 小宝宝_ef99 | 来源:发表于2019-04-11 16:07 被阅读0次

参考资料
https://angular.cn/guide/reactive-forms#dynamic-controls-using-form-arrays

引入方法
import { ReactiveFormsModule } from '@angular/forms';

@NgModule({
  imports: [
    // other imports ...
    ReactiveFormsModule
  ],
})
export class AppModule { }
基础概念

1、FormControl
表单的最小单元,例如 input、select等

import { FormControl } from '@angular/forms';
name: FormControl;
this.name = new FormControl('初使姓名');

2、FormGroup
一组 FormControl 的合集,FormGroup相当于js中的对象,此时FormControl相当于js中的基础数据类型,如string、number等等

import { FormGroup } from '@angular/forms';
targetForm: FormGroup;  //  targetForm为name和age的合集
this.targetForm = new FormGroup({
  name: new FormControl('包子'),
  age: new FormControl(22)
})

注意: FormGroup和FormControl各自都有验证器,当FormGroup和FormControl的验证器都验证通过则表单才验证通过

3、FormArray
一组 FormControl 或者FormGroup或者FormArray或者三者混合的合集,相当于js中的数组

formArray: FormArray
this.formArray = this.fb.array([])
setInfo(data) {
  return this.fb.group({
      name: [data.name],
      age: [data.age]
    })
}
// 动态添加一组带有姓名和年龄的人的数据
const info = this.setInfo({name: 'Amy', age: '18'})
const infos = this.formArray as FormArray
infos.push(info)

// 页面渲染
<div *ngFor="let item of this.formArray.controls; let i=index">
   <div [formGroupName]="i">
     <label>姓名: <input type="text" [formControlName]="name"></label>
     <label>年龄:<input type="number" [formControlName]="age"></label>
   </div>
</div>

注意:
FormControl、FormGroup和FormArray都继承了AbstractControl,所以它们都有AbstractControl所有的属性和方法
1、属性:valid、value、errors、touched、untouched 等等
2、方法:setValue、patchValue、reset等等

方法介绍

1、setValue
设置表单的值,结构必须与表单一致,否则会报错

this.targetForm.setValue({
   name: 'Tom',
   age: '16'
})

2、patchValue
更改表单的值,可以单个更新

this.targetForm.patchValue({
   age: '18'
})

3、reset
重置表单,将表单恢复至未被触发的状态(touched→untouched)

常用的表单验证器

1、FormGroup 整体验证器

this.targetForm = new FormGroup({
  name: new FormControl('包子'),
  age: new FormControl(22)
}, { validator: GroupValidator })

例子:注册用户时验证密码和确认密码是否相等

// 表单模型
this.registerForm = fb.group({
  phone: ['', Validators.compose([Validators.required,  phoneValidator])],
  password: ['', Validators.required],
  confirmPassword: ['', Validators.required]
}, {validator: isEqualPasswords('password', 'confirmPassword')})  // 全局验证器
 
// 验证器实现
 isEqualPasswords(passwordKey: string, confirmPasswordKey: string) {
  return (group: FormGroup): {[key: string]: any} => {
    const password = group.controls[passwordKey];
    const confirmPassword = group.controls[confirmPasswordKey];
    if (password.value !== confirmPassword.value) {
      return {
        InequalityPasswords: true
      };
    }
  }
}
// 页面渲染
<div *ngIf="registerForm.hasError('InequalityPasswords')">
    密码和确认密码不一致!
</div>

2、FormArray 整体验证器

this.formArray = this.fb.array([], ArrayValidator)  // 第二个参数为整体验证器
表单适用情况

FormGroup 适用于明确的对象,是定义好的
FormArray 适用于需要动态的添加数组成员的情况

相关文章

  • Angular表单验证

    angular4里一个响应式编程的小例子 Angular2 响应式表单验证 Angular开发(十一)-关于响应式...

  • Angular2 响应式表单

    参考资料https://angular.cn/guide/reactive-forms#dynamic-contr...

  • 细说 Angular 2+ 的表单(二):响应式表单

    细说 Angular 2+ 的表单(一):模板驱动型表单 响应式表单 响应式表单乍一看还是很像模板驱动型表单的,但...

  • Angular2 响应式表单异步验证

    参考资料https://angular.cn/guide/form-validation#async-valida...

  • Angular 表单1--响应式表单

    Angular 提供了两种不同的方法来通过表单处理用户输入:响应式表单和模板驱动表单。本节先讲响应式表单。最终实例...

  • 14.《Angular响应式表单》

    一、使用响应式表单 Angular 的响应式表单能让实现响应式编程风格更容易,这种编程风格更倾向于在非 UI 的数...

  • angular表单的使用实例

    大纲 1、模板驱动表单的创建2、响应式表单的创建3、模板驱动型表单的自定义指令4、响应式表单的自定义指令5、父组件...

  • 2018-08-16 angular--disabled

    响应式表单 - disabled表现 当表单控件设置了disabled属性 * Disabled co...

  • angular表单知识点

    大纲 1、对表单的理解2、模板驱动表单(Template Driven Forms)3、响应式表单(Reactiv...

  • Angular表单处理

    第七章 表单处理 学习内容: 一.简述模板式表单与响应式表单的不同 Angular表单API 模板式表单简述: ...

网友评论

      本文标题:Angular2 响应式表单

      本文链接:https://www.haomeiwen.com/subject/cymoiqtx.html