Angular Reactive Forms 自订表单验证器

中秋连假开始啦,先祝大家中秋节快乐!!
接连着前两天的日记文插播,
今天就接续着先前还没聊完的部份开始接续下去罗


有表单 当然少不了验证,这次的情境是

名字是必填栏位。
手机不一定会是必填,但填了後必须符合手机的格式,09 开头 共 10 码

来罗!!


加上表单验证

在这个 form 表单的下方 新增一个验证方式,动态验证就写在 validator 这里面

export class FormComponent implements OnInit {
  form: FormGroup = new FormGroup(
    {
      name: new FormControl("", Validators.required),
      phone: new FormControl(""),
      favorites: new FormArray([]),
    },
    { validators: validator }
  );
}

自订验证器

.ts

export const validator: ValidatorFn = (
  control: AbstractControl
): ValidationErrors | null => {
  const { name, phone, favorites } = control.value;
  // 手机号码正规化
  const regPhone = RegExp(/^09[0-9]{8}$/);
  return !phone ? null : regPhone.test(phone) ? null : { phone: true };
};

若是号码填写错误,把 form 的 console 叫出来 会是像图上这样

一开始我们有设定名字为必填,图上红色框起来就是没填到名字所出现的讯息

若无误则会是 null,这样我们就可以在 tmeplate 上做显示让使用使知道表单哪里有问题


把错误讯息 show 出来!

在 html 里加上错误讯息

<form [formGroup]="form" (ngSubmit)="onSubmit()">
  <div>
    <label for="">name:</label>
    <input formControlName="name" type="text" />
    <!-- 错误讯息判断 -->
    <p style="color:red" *ngIf="form.get('name')?.errors?.required">
      Name Required
    </p>
  </div>
  <div>
    <label for="">phone:</label>
    <input formControlName="phone" type="tel" />
  </div>
  ...略
  <!-- 错误讯息判断 -->
  <p style="color:red" *ngIf="form.errors?.phone">Your phone Error</p>
  <button type="submit">Submit</button>
</form>

下图为判断 form 里的验证讯息,来决定要不要让表单送出

参考文件:

把自订验证器新增到响应式表单中
https://angular.tw/api/forms/ValidatorFn


後记:
本来是有点懒的打这篇的,但前几天,同事对我说,之後我们的表单都要有动态验证哦!
我....嗯,...好 XDDD 然後就把久远的回忆翻回来,再次熟悉了一下,这篇因此而生


<<:  DAY4 LINE Bot应用程序设定

>>:  DAY7: Node 的事件循环 (Event loop)

Day19 样式变化(动画3) CSS转换

JavaScript Hooks 使用JavaScrip Hooks以v-on的方式来监听,来完成我...

[Day 20] - 初探永丰银行线上收款API - 订单查询及其他(2)

昨晚睡一睡突然一个念头闪过, 为什麽用那麽多try catch 昨天写的程序中,我用了大量的try ...

DAY13 特徵工程-资料标准化与降维

一、为何要做标准化 以最简单的方式来说,一份资料中,不可能每个特徵的范围都是一样的,当我们需要拿两笔...

冒险村10 - or equals

10 - or equals Ruby 的 ||=(or equals)运算符号使用频率是个使用频率...

【Day 20】 实作 - 於 AWS Quicksight 建立 Sankey diagram 以及设定 Action

昨天我们已经透过 AWS Glue Job 来调整 Partition 分区结构以及将此格式转换成 ...