美文网首页
Angular 解决 FormGroup 和 FormArray

Angular 解决 FormGroup 和 FormArray

作者: niccky | 来源:发表于2018-12-26 11:57 被阅读0次

    在以往动态处理 FormGroup 和 FormArray 嵌套表单时,通常要写一大堆的长长的形如这样的代码:

    <form nz-form [formGroup]="form">
        <div formArrayName="teacher">
          <div nz-form-control *ngFor="let m of teachers.controls;index as isFirst" >
            <div [formGroupName]="isFirst">
              <input nz-input formControlName="name" />
            <div *nz-explain="这里区了获取一个FormControl,需要写很长的代码,如:form.get('user.school.name')......">
                error...
            </div>
            </div>
          </div>
        </div>
      </div>
    </form>
    

    这其中多了一些乱七八糟的东西,如:formArrayName,formGroupName,formControlName,form.get(,...,) ,看到或写这样的代码感觉要晕死过去...
    为了解决这样的问题,想出了下面的这个解决方案

    解决方案

    import { Directive, TemplateRef, Input, QueryList, ViewContainerRef, Component, ContentChildren } from '@angular/core';
    import { FormGroup, FormControl } from '@angular/forms';
    
    @Directive({
      selector: '[ctrl]',
    })
    export class Ctrl {
      constructor(public view: ViewContainerRef, public template: TemplateRef<any>) {}
    }
    
    @Component({
      selector: 'group',
      template: `<ng-content></ng-content>`
    })
    export class SeeFormGroupComponent {
      @Input() group: FormGroup | FormControl | any;
      @ContentChildren(Ctrl) ctrl: QueryList<Ctrl>;
      get fields() {
        if (this.group instanceof FormGroup) {
          return this.group.controls;
        }
    
        if (this.group instanceof FormControl) {
          return this.group;
        }
    
        return new FormControl(this.group);
      }
    
      ngAfterContentInit() {
        if (this.group) {
          const ctrls = this.ctrl.toArray();
          setTimeout(()=>{
            ctrls.forEach(r => {
              r.view.createEmbeddedView(r.template, { $implicit: this.fields });
            })
          },0);
        }
      }
    }
    

    使用

    <group *ngFor="let m of users.controls" [group]="m">
            <div *ctrl="let user">
                <input [formControl]="user.name"  />
                <input [formControl]="user.label" /> 
                <div *ngIf="user.name.errors">
                  用户名不能为空!
                </div>
            </div>
          </group>
    
    

    终于不用看到,形如:formArrayName,formGroupName,formControlName,form.get(,...,) 这些乱七八糟的东西了

    天之骄子 深圳 2018.12.26

    相关文章

      网友评论

          本文标题:Angular 解决 FormGroup 和 FormArray

          本文链接:https://www.haomeiwen.com/subject/usfhlqtx.html