Angular学习笔记44:响应式表单-获取两层FormGroup嵌套值得变化和两层FormGroup赋值

这篇Angular学习笔记详细介绍了如何获取和设置嵌套的FormGroup值的变化,包括对整个FormGroup、单个实例、第二层FormGroup及其中的实例赋值。文章通过示例代码演示了setValue()和patchValue()方法的用法,并强调了赋值结构的重要性。
摘要由CSDN通过智能技术生成

Angular学习笔记43:响应式表单:FormGroup嵌套以后。

获取FormGroup中值得变化

在 FormGroup 中,有时需要捕获这个控件的值得变化,

  • 捕获name的输入值得变化
    在构造方法中,订阅validateForm中name这个实例值得变化。并将其输入。
constructor() {
    this.validateForm.get('name').valueChanges.subscribe(nameChange => {
      console.log(nameChange);
    });
  }

保存运行,在name这个控件中输入相应的值,在控制台可以看到每次变化的值。

在这里插入图片描述

获取嵌套中FormGroup中值得变化

  1. 使用validateForm连续的get()方法:
this.validateForm.get('address')
      .get('area').valueChanges
      .subscribe(areaChange => {
        console.log(areaChange);
      });
  1. 利用 get 方法返回一个FormGroup
get addressForm() {
    return this.validateForm.get('address') as FormGroup;
  }

通过这个addressForm来捕获到address第二层中值得变化

this.addressForm.get('street')
      .valueChanges
      .subscribe(streetChange => {
        console.log(streetChange);
      });

在这里插入图片描述

修改后的类文件如下:

import {Component, OnInit} from '@angular/core';
import {AsyncValidator, FormControl, Validators, FormBuilder, FormGroup} from '@angular/forms';

@Component({
  selector: 'app-user-info',
  templateUrl: './user-info.component.html',
  styleUrls: ['./user-info.component.less']
})
export class UserInfoComponent implements OnInit {
  validateForm = new FormGroup({
    name: new FormControl(null, [Validators.required]),
    age: new FormControl(null, [Validators.required]),
    email: new FormControl(null, [Validators.required]),
    address: new FormGroup({
      area: new FormControl(null, [Validators.required]),
      street: new FormControl(null, [Validators.required]),
      houseId: new FormControl(null, [Validators.required]),
    })
  });

  constructor() {
    this.validateForm.get('name').valueChanges.subscribe(nameChange => {
      console.log(nameChange);
    });
    this.addressForm.get('street')
      .valueChanges
      .subscribe(streetChange => {
        console.log(streetChange);
      });
    this.validateForm.get('address')
      .get('area').valueChanges
      .subscribe(areaChange => {
        console.log(areaChange);
      });
  }
  
  get addressForm() {
    return this.validateForm.get('address') as FormGroup;
  }

  ngOnInit() {
  }

  public handleInitForm(): void {
    this.validateForm.reset();
  }

  public handleSubmit(): void {
    console.log('点击了提交表单');
    console.log(this.validateForm.value);
  }
}

Angular学习笔记40:响应式表单:一个简单的表单并修改表单的值中,使用了formControl 的 setValue() 方法对单个FormControl进行赋值。
在 FormGroup 中同样可以使用setValue()方法来为 FormGroup 赋值。

对整个 FormGroup 赋值

如果要对整个 FormGroup 赋值,就要将 FormGroup 中的每一个实例都要赋值,不能丢掉任何一个实例。

this.validateForm.setValue({
      name: 'W先生',
      age: '25',
      email: 'xx@xx.com',
      address: {area: 'area赋值', street: 'street赋值', houseId: 'houseId赋值'}
    });

当我们不小心丢掉一个实例的时候,就会报错:(为了试错,将houseId丢掉了)

this.validateForm.setValue({
      name: 'W先生',
      age: '25',
      email: 'xx@xx.com',
      address: {area: 'area赋值', street: 'street赋值', }
    });

此时保存运行就会报错:

在这里插入图片描述

为了解决这个错误,可以使用 FormGroup 的patchValue()的这个方法,patchValue()相比较 setValue()而言,在遇到赋值过程中,遇到实例丢失的情况时,会自动的将这里定为失败,而setValue() 会严格遵守原来 validateForm 的表单结构,并整体替换。
使用patchValue()对表单进行赋值:

this.validateForm.patchValue({
      name: 'W先生',
      age: '25',
      email: 'xx@xx.com',
      address: {area: 'area赋值', street: 'street赋值'}
    });

此时即使丢掉了 houseId,也不会报错,只是 houseId 没有正确的赋值。

在这里插入图片描述

对单个 FormGroup 中的某一个实例 赋值

对FormGroup第一层的name单独赋值:

1.使用setValue()

this.validateForm.get('name').setValue('W先生');

2.使用patchValue()

this.validateForm.get('name').patchValue('W先生');

对第二层的 FormGroup 赋值

由于第二层的 FormGroup 是第一层 FormGroup的 address这个实例的,所以先获取到address这个实例。然后在对这个实例的 FormGroup 进行赋值。
1.使用setValue()

  • 直接通过validateForm进行赋值:
this.validateForm.get('address').setValue({
      area: 'area赋值',
      street: 'street赋值',
      houseId: 'houseId赋值'
    });

注意:使用setValue()时必须要保持赋值结构和address这个formGroup的表单的结构的一致

  • 使用 get 方法获取的FormGroup进行赋值:
this.addressForm.setValue({
      area: 'area赋值',
      street: 'street赋值',
      houseId: 'houseId赋值'
    });

同样:这里也要注意保持赋值结构和address这个formGroup的表单的结构的一致

2.使用patchValue()

  • 直接通过validateForm进行赋值:
this.validateForm.get('address').patchValue({
      area: 'area赋值',
      street: 'street赋值',
      houseId: 'houseId赋值'
    });
  • 使用 get 方法获取的FormGroup进行赋值:
this.addressForm.patchValue({
      area: 'area赋值',
      street: 'street赋值',
      houseId: 'houseId赋值'
    });

对第二层中的 FormGroup 中的某一个实例 赋值

对第一层FormGroup的address中的area单独赋值:

1.使用setValue()

  • 直接通过validateForm进行赋值:
this.validateForm.get('address').get('area').setValue('area赋值');
  • 使用 get 方法获取的FormGroup进行赋值:
this.addressForm.get('area').setValue('area赋值');

2.使用patchValue()

  • 直接通过validateForm进行赋值:
this.validateForm.get('address').get('area').patchValue('area赋值');
  • 使用 get 方法获取的FormGroup进行赋值:
this.addressForm.get('area').patchValue('area赋值');
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值