zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    基本数据类型
    python IF while逻辑判断语句
    python文件的执行
    【ListBox】ListBox的相关操作
    C#基础-replace()过滤非法字符
    vmware虚拟机提示:无法将Ethernet0连接到虚拟网络vmnet02018-03-07
    linux 网卡配置文件详解2018-03-07
    eclipse+pydev 安装和配置过程
    Object与String
    P3369 【模板】普通平衡树(权值线段树)
  • 原文地址:https://www.cnblogs.com/chenyingzuo/p/12555204.html
Copyright © 2011-2022 走看看