Angular 使用总结(六)表单之快速生成

快速生成一个表单,需求如下:

 

收集以下信息:

姓名,字符串,必填

地址,字符串,选填

兴趣,字符串,选填

问题,对象,必填

电话,数组,选填

 

示例数据:

  data = {
    name: 'zhangming',
    address: 'China Xian',
    hobby: 'Sing',
    questions: {
      question1: "What's your pet?",
      answer1: 'dog',
      question2: 'Where do you want to go?',
      answer2: 'England'
    },
    tels: ['13282928282','123272837282']
  }

 

需求,如果有数据能快速load到页面,同时页面也给用户编辑,之后能快速取出数据
 
 1. 引用模块

 

 2. 定义表单对象

 

 属性名与数据源的属性名最好一一对应,这样好取数据

 

3.编写HTML

<form [formGroup]="form" (ngSubmit)="onSubmit()" class="form">
    <label>
        Name:
        <input formControlName="name" required>
    </label>
    <label>
        Address:
        <input formControlName="address" [style.width.px]="300">
    </label>
    <label>
        Hobby:
        <input formControlName="hobby">
    </label>
    <div formGroupName="questions">
        <label>
            Qusetion1:
            <input formControlName="question1" required>
        </label>
        <label>
            Answer1:
            <input formControlName="answer1" required>
        </label>
        <label>
            Qusetion2:
            <input formControlName="question2" required>
        </label>
        <label>
            Answer2:
            <input formControlName="answer2" required>
        </label>
    </div>
    <div formArrayName="tels">
        Telphone
        <button (click)="addTel()">+</button>

        <label *ngFor="let tel of telList.controls;let i = index">
            <input [formControlName]="i">
        </label>
    </div>

    <button (click)="onSubmit()" [disabled]="!form.valid" [style.margin-top.px]="50">submit</button>
</form>

 

注意几个点:

 

 

使用:

1. 数据到UI

 

 

2. 从UI取数据

 

 

 运行效果:

 

简单的数据验证:

1. 使用 Angular 内置的一些校验和 一个自定义校验逻辑

自定义的校验:

export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {
  return (control: AbstractControl): { [key: string]: any } | null => {
    const forbidden = nameRe.test(control.value);
    return forbidden ? { 'forbiddenValue': { value: control.value } } : null;
  };
}

 

使用校验,这里对一个控件加了三个校验,前两个是内置,最后一个自定义

ts:

  form = this.fb.group({
    name: ['', [Validators.required, Validators.minLength(4), forbiddenNameValidator(/^\d{4}$/)]],
    address: [''],
    hobby: [''],
    questions: this.fb.group({
      question1: ['', Validators.required],
      answer1: ['', Validators.required],
      question2: ['', Validators.required],
      answer2: ['', Validators.required]
    }),
    tels: this.fb.array([this.fb.control('')])
  });

 

 

 暴露name这个form control,这样就能在html里引用错误

 

 

加之前:

    <label>
        Name:
        <input formControlName="name" required>
    </label>

 

加之后:

    <label>
        Name:
        <input formControlName="name" required>
        <ng-container *ngIf="name.invalid && (name.touched || name.dirty)" >
            <div *ngIf="name.errors.required" class="error">
                Name is required.
            </div>
            <div *ngIf="name.errors.minlength" class="error">
                Name must be at least 4 characters long.
            </div>
            <div *ngIf="name.errors.forbiddenValue" class="error">
                Name can not be four number.
            </div>
        </ng-container>
    </label>

 

效果:

刚运行起来,不操作,不显示消息:

 

 点击之后:

 

 输入几个字符:

 

 输入不符合正则表达式:

 

 css:

.error {
    color: #a94442;
}

 

posted @ 2020-03-23 21:25  内心澎湃的水晶侠  阅读(353)  评论(0编辑  收藏  举报