响应式表单

FormControl: 表单中的每一个item
userName: FormControl = new FormControl('aaa')
FormGroup: 表单数据分组,可以嵌套

formModel: FormGroup = new FormGroup({
	from: new FormControl(),
	to: new FormControl()
})

FormArray: 表单同样数据的集合

emails: FormArray = new FormArray([
	new FormControl('a@a.com'),
	new FormControl('b@b.com')
])

在这里插入图片描述
1.引入响应式表单依赖

imports: [
    ReactiveFormsModule
  ],

2.编写布局文件

<form [formGroup]="formModel" (submit)="onSubmit()">
  <div>
    用户名: <input formControlName="userName" type="text">
  </div>
  <div [hidden]="!formModel.hasError('required', 'userName')">用户名是必填</div>
  <div formGroupName="dateRange">
    开始时间:<input formControlName="from" type="date">
    结束时间:<input formControlName="to" type="date">
  </div>
  <div>
    <ul formArrayName="emails">
      <li *ngFor="let e of this.formModel.get('emails').controls; let i = index">
        <input type="text" [formControlName]="i">
      </li>
    </ul>
    <button type="button" (click)="addEmail()">增加Email</button>
  </div>
  <div>
    <button type="submit">保存</button>
  </div>
</form>

3.ts文件绑定数据

  formModel: FormGroup = new FormGroup({
    userName: new FormControl(),
    dateRange: new FormGroup({
      from: new FormControl(),
      to: new FormControl()
    }),
    emails: new FormArray([
      new FormControl('a@email.com'),
      new FormControl('b@email.com')
    ])
  });
  // FormBuilder 简化,可增加参数添加校验规则
  // constructor(private formBuilder: FormBuilder) { }
  // formModel: FormGroup = this.formBuilder.group({
  //   userName: ['', [Validators.required, this.userNameValidator]], // 校验规则
  //   dateRange: this.formBuilder.group({
  //     from: [''],
  //     to: ['']
  //   }),
  //   emails: this.formBuilder.array([
  //     ['a@email.com'],
  //     ['b@email.com']
  //   ])
  // });
  // 自定义校验器
  userNameValidator(control: FormControl): any {
    let valid = control.value.length > 3;
    return valid ? null : {name: '名字长度小于三'};
  }
    emails: new FormArray([
      new FormControl('a@email.com'),
      new FormControl('b@email.com')
    ])
  });
  addEmail() {
    let emails = this.formModel.get('emails') as FormArray;
    emails.push(new FormControl());
  }
  onSubmit() {
    let valid = this.formModel.valid; // 判断校验结果
    let error = this.formModel.get('userName').errors; // 返回错误信息
    console.log(this.formModel.value);
  }

状态字段
touched和untouched // 是否获取过焦点(可控制错误信息的显示和不显示)
<div [hidden]="formModel.get('userName').untouched"></div>
对应css类选择器.ng-touched``.ng-untouched
pristine和dirty // 值有没有被改变过
<div [hidden]="formModel.get('userName').pristine">
对应css类选择器.ng-pristine``.ng-dirty
pending // 异步请求中
对应css类选择器.ng-pending

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值