Angular ReactiveForms(响应式表单)中的value和getRawValue()的区别

Angular中极好的一点就是表单,使用ReactiveForms可以方便快捷的进行表单验证。

最近遇到一个bug,会员卡请假,可填写请假天数(days)或设置假期截止日期(endAt),但只有一个可编辑,另一个为disabled状态,并且days改变自动计算endAt,设置endAt自动计算days。

定义一个表单:

import {FormBuilder, FormGroup, Validators} from '@angular/forms'

constructor(private fb: FormBuilder) {
  this.daysForm = fb.group({
    days: ['', Validators.compose([Validators.required, aliValidators.number])],
    endAt: ['', Validators.required],
    remark: [''],
    daysType: ['numb'],             // 输入天数 or 选择日期
  })
}

提交表单时需要取出表单中的数据,一般来说,this.daysForm.valuethis.daysForm.getRawValue()均可,并且取出的值是相同的。

但某次此功能通过设置endAt,并自动计算days提交时,使用this.daysForm.value,无论如何都取不出value中的days值,界面显示正确
界面显示
值取不到
值1
debug时发现daysForm这个FormGroup的value属性中确实无days这个字段
值2
后来尝试使用this.daysForm.getRawValue()取值,取到了正确的days,且days FormControl的status = 'DISABLED',但是value = 16存储正确
值3
在这里插入图片描述
由此可见,

  • 当一个FormControl(days)为禁用状态且手动改变它的值时 this.daysForm.patchValue({days: 16}),改变的仅仅是此FormControl的value,并不能改变FormGroup(daysForm)的value中days的值。
  • this.daysForm.value取得是FormGroup(daysForm)的value属性,返回一个对象;
    this.daysForm.getRawValue()会遍历FormGroup(daysForm)的controls属性,返回每一个FormControl中的value;即
const value = {}, {controls} = this.daysForm
for (const key in controls) {
  if (key) {
    value[key] = controls[key].value
  }
}

this.daysForm.getRawValue() = value	// object中的值相等
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值