Angular开发(十一)-关于响应式表单及表单的校验

一、响应式表单定义

响应式表单:我们在组件中创建表单控件的对象树,并使用特定的方式将绑定到组件模板中的原声表单控件元素上

二、响应式表单的好处

我们可以在组件类中直接创建和维护表单控件对象。由于组件类可以同时访问数据模型和表单控件结构, 因此我们可以把表单模型值的变化推送到表单控件中,并把变化后的值拉取回来。 组件可以监听表单控件状态的变化,并对此做出响应

三、响应式表单中涉及到的词汇及含义

词汇解释使用场景
formControl用户跟踪一个单独表单控件的值和有效性状态
formGroup用户跟踪一组表单控件的值和有效性状态
FormArray有序数组的值和有效性

四、formControl简单的使用

public name1 = new FormControl(初始值,验证器数组,一部验证器数组)
<input type="text" class="form-control" [formControl]="name1">

五、formGroup的使用

public formgroup = new FormGroup({
    name:new FormControl("你好"),
    password:new FormControl("",Validators.required)
})

在html页面中可以通过:
* 1、formgroup.value获取表单中全部的值
* 2、formgroup.status检验表单当前是处于什么状态

<form role="form" [formGroup]="formgroup" novalidate>
    <div class="form-group">
        <label>用户名:</label>
        <input type="text" class="form-control" formControlName="name" />
    </div>
    <div class="form-group">
        <label>密码:</label>
        <input type="password" class="form-control" formControlName="password" />
    </div>
</form>
<p>Form value: {{ formgroup.value | json }}</p>
<p>Form status: {{ formgroup.status | json }}</p>

六、与FormBuilder结合使用,官方解释

修改组件代码

    ...
    constructor(private fb : FormBuilder) {
        this.createForm();
    }
    public formgroup : FormGroup;
    createForm() {
        this.formgroup = this.fb.group({
              name: new FormControl("你好"), //下面几种方式也可以
              password: ["",Validators.required],
              city:''
        })
    }
    ....

七、多个FormGroup的使用

项目中表单越来越复杂,那么就可以使用多个FormGroup来区分使用

<fieldset formGroupName="password">
    <div class="form-group">
        <label>密码:</label>
        <input type="password" class="form-control" formControlName="first" />
    </div>
    <div class="form-group">
        <label>确认密码:</label>
        <input type="password" class="form-control" formControlName="last" />
    </div>
</fieldset>
createForm() {
    this.formgroup = this.fb.group({
        name: new FormControl("你好"), 
        password: this.fb.group({
            first:'',
            last:''
        }),
        city:'',
        state:'',
        sex:["",Validators.required],
        hobby:''
    })
}

八、获取FromControl的属性

属性说明
valueFormControl的值。
statusFormControl的有效性。可能的值有VALID、INVALID、PENDINGDISABLED
pristine如果用户尚未改变过这个控件的值,则为true。它总是与myControl.dirty相反。
untouched如果用户尚未进入这个HTML控件,也没有触发过它的blur(失去焦点)事件,则为true。 它是myControl.touched的反义词。

使用方式

<input type="text" class="form-control" [formControl]="name1">
<div>{{name1.value}}</div>
<div>{{name1.status}}</div>
<div>{{name1.pristine}}</div>
<div>{{name1.untouched}}</div>
<input type="text" class="form-control" formControlName="city" />
<p>{{formgroup.get("city").value}}</p>

九、关于赋值、修改、提取

  • 1、给form表单里面的formControl赋值

    • 前面就提到了,直接在创建的时候赋值就可以传递到html页面
    • 使用setValue(尝试失败,直接使用patchValue)
  • 2、修改值使用patchValue

    //修改值
    edit(){
        this.formgroup.patchValue({
            name:"我不是很好"
        })
    }
  • 3、提取表单值

    <form role="form" [formGroup]="formgroup" novalidate (ngSubmit)="postData()">
    ....
    </form>
    //提交数据
    postData(){
        console.log(this.formgroup.value);
    }

十、表单的校验

  • 1、使用自带的校验器

    • Validators.required必填字段
    • Validators.minLength 最小长度
    • Validators.maxLength最大长度

      username:["",[Validators.required,Validators.minLength(3),Validators.maxLength(6)]],
      <!--还没封住指令-->
      <div class="form-group">
          <label>用户名:</label>
          <input type="text" [class]="!myform.get('username').untouched?(myform.get('username').status==='VALID'?'form-control':'form-control error'):'form-control'" formControlName="username">
          <!--如果没有访问的时候或者不含有required的时候隐藏-->
          <p [hidden]="myform.get('username').untouched || !myform.hasError('required','username')" class="text-danger">用户名必填</p>
          <p [hidden]="myform.get('username').untouched || (!myform.hasError('minlength','username') ? !myform.hasError('maxlength','username'):null)" class="text-danger">用户名长度有误</p>
      </div>
  • 2、自定义校验器

    • 直接定义在组件内

      //定义一个手机号码的校验器
        mobileValidator(control:FormControl):any{
          var reg = /^1[34578]\d{9}$/;
          let valid = reg.test(control.value);
          //如果验证通过就返回null否则就返回手机号码格式有误
          return valid ? null:{moblie:"手机号码格式有误"};
        }
      //使用
      mobile_num:["",[Validators.required,this.mobileValidator]],
    • 定义一个服务注入到组件中(自行看代码实现)

十一、项目源文件下载地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水痕01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值