
FormControl 实例用于追踪单个表单控件的值和验证状态。FormGroup 用于追踪一个表单控件组的值和状态。FormArray 用于追踪表单控件数组的值和状态。ControlValueAccessor 用于在 Angular 的 FormControl 实例和原生 DOM 元素之间创建一个桥梁。@NgModule({
    imports:[
     FormsModule, ReactiveFormsModule   
    ]
})
names1 = new FormControl(‘‘);
<input type="text" [formControl]="names1">
<input type="text" [(ngModel)]="name1">
  profileForm:FormGroup = new FormGroup({
    firstName: new FormControl(‘‘),
    lastName: new FormControl(‘‘),
    address:new FormGroup({
      name1:new FormControl(‘‘),
      name2:new FormControl(‘‘)
    })
  });
<form [formGroup]="profileForm" (ngSubmit)="onSub()">
  <div>
    <label>
      <input type="text" formControlName="firstName">
    </label>
  </div>
  <div formGroupName="address">
    <div>
      <input type="text" formControlName="name1">
    </div>
  </div>
</form>
  profileForm:FormGroup=this.fb.group({
    firstName:[‘aa‘],
    address:this.fb.group({
      name1:[‘bbb‘]
    })
  })
constructor(private fb: FormBuilder) { }
html跟第三种一种
 constructor(private fb: FormBuilder) {}
  profileForm: FormGroup = this.fb.group({
    firstName: [‘aa‘],
    address: this.fb.group({
      name1: [‘bbb‘],
    }),
    name2: this.fb.array([
      this.fb.control(‘ccc‘),
    ])
  })
  get name2(){
    return this.profileForm.get(‘name2‘) as FromArray;
  }
另一种
  profileForm:FormGroup = new FormGroup({
    firstName: new FormControl(‘aaa‘),
    address:new FormGroup({
      name1:new FormControl(‘bbb‘),
    }),
    name2:new FormArray([
      new FormControl(‘ccc‘)
    ])
  });
html
<form [formGroup]="profileForm" (ngSubmit)="onSub()">
  <div>
    <label>
      <input type="text" formControlName="firstName">
    </label>
  </div>
  <div formGroupName="address">
    <div>
      <input type="text" formControlName="name1">
    </div>
  </div>
  <div formArrayName="name2">
    <div *ngFor="let item of name2.controls;let i=index">
      <label>
        <input type="text" [formControlName]="i">
      </label>
    </div>
  </div>
</form>
api
增删查找的
    controls: AbstractControl[]  查询
    length: number   			长度
    push(control: AbstractControl): void  增加
    removeAt(index: number): void   删除指定的
    clear(): void 删除全部
    insert(index: number, control: AbstractControl): void  某个位置后插入一个
    at(index: number): AbstractControl   拿到第几个
    patchValue(value: any[], options: { onlySelf?: boolean; emitEvent?: boolean; } = {}): void   设置值包括禁用的值
  reset(value: any = [], options: { onlySelf?: boolean; emitEvent?: boolean; } = {}): void  清空
  getRawValue(): any[]  查询值,包括禁用的
  setControl(index: number, control: AbstractControl): void 替换
  setValue(value: any[], options: { onlySelf?: boolean; emitEvent?: boolean; } = {}): void   设置值,不包括禁用
继承自 forms/AbstractControl
  value: any   拿到需要值
touched: boolean  一旦触碰,则为true(好像是失去焦点吧)
<form [formGroup]="profileForm" (ngSubmit)="onSub()">
  <div formArrayName="nameArr">
    <div *ngFor="let item of nameArr.controls;let i=index">
      <label>
        <input type="text" [formControlName]="i">
      </label>
    </div>
  </div>
</form>
<button (click)="addForm(3)">增加</button>
<button (click)="removeForm(2)">删除第三个</button>
<button (click)="removeClear()">删除全部</button>
<button (click)="insertForm()">在第三个后插入一个</button>
<button (click)="valueSub()">查询拿到数组的值</button>
<button (click)="atValue()">拿到第2个的AbstractControl 禁用</button> <br>
<button (click)="setValues()">设置</button>
profileForm: FormGroup = new FormGroup({
    nameArr: new FormArray([
      new FormControl(‘ccc‘)
    ])
  });
 setCon(){
     // 把所以为2的替换成空的
    this.nameArr.setControl(2,this.control)
  }
  get nameArr() :FormArray{
    return this.profileForm.get(‘nameArr‘) as FromArray;
  }
  formCon(n) {
    return new FormControl(n)
  }
  //增加
  addForm(num) {
    this.nameArr.push(this.formCon(num))
  }
  //删除
  removeForm(num: number) {
    this.nameArr.removeAt(num)
  }
// 清除全部
  removeClear() {
    this.nameArr.clear();
  }
  //位置插入
  insertForm() {
    this.nameArr.insert(3, this.formCon(‘bbb‘))
  }
  //查询某项
  get getTwo():FormControl{
    return this.nameArr.at(1) as FormControl;
  }
  //查询数组整体的值
  valueSub() {
    // console.log(this.nameArr.value);//禁用的拿不到
    console.log(this.nameArr.getRawValue());//这个禁用也能拿到
  }
  setValues(){
    this.nameArr.patchValue([111,222])
    // this.nameArr.setValue([111,222]) //严谨一些多了少了都会报错
    // this.nameArr.setValue([111,222],{ onlySelf: true }) //严谨一些多了少了都会报错
    // { onlySelf: true } 就是更改的值不更新给父级
  }
  //查询指定的那一个AbstractControl 禁用
  atValue() {
    this.nameArr.at(2).disable();
  }
修改,你有没有觉得这样写不够优雅
<form [formGroup]="profileForm" (ngSubmit)="onSub()">
  <div formArrayName="nameArr">
    <div *ngFor="let item of nameArr.controls;let i=index">
      <label>
        <input type="text" [formControlName]="i">
      </label>
    </div>
  </div>
</form>
 nameArr: FormArray = new FormArray([])
  profileForm: FormGroup;
  ngAfterViewInit() {
  }
  ngOnInit(): void {
    this.profileForm = new FormGroup({
      nameArr:this.nameArr
    });
  }
  get control(): FormControl {
    return new FormControl()
  }
  addControl() {
    this.nameArr.push(this.control)
  }
原文:https://www.cnblogs.com/fangdongdemao/p/14204487.html