【发布时间】:2017-02-15 11:21:48
【问题描述】:
我正在使用 FormArrays 来处理可变长度的对象数组。虽然我目前的实现大部分都有效,但在验证方面我遇到了问题,因为对我的 FormArray 所做的任何更改都不会传播到它的“父”FormGroup...或者至少不会自动传播 FormGroup 的值 可以 通过更改由所述 FormGroup 管理的另一个控件的值来更新。
在这一点上,我不知道我的实现是否有问题,或者我是否期待一些我不应该做的事情......无论最终的“问题”是什么,我都会很乐意接受此时的任何输入。
链接到 Plunker:https://plnkr.co/edit/PLslyJo1YOszGwTpujyx (Angular 版本是 2.0.1)
Plunker 中 app.ts 顶部的注释详细说明了重现问题的步骤(或者对我来说有什么问题)。
由于 SO 在链接到 Plunker 时要求提供一些代码,以下是与 FormGroup 和 FormArray 的定义有关的行
this.form = this.fb.group({
"size":[0, Validators.required],
"someArray": this.fb.array(this.initFormArray(0), Validators.required),
"someOtherField":[null]
});
initFormArray(size:number):FormGroup[]{
let newFormArray:FormGroup[] = [] ;
for(let i = 0 ; i < size ; i++){
newFormArray.push(this.fb.group({
fieldA: [null, Validators.required],
fieldB: [null, Validators.required]
}));
}
return newFormArray;
}
updateFormArray(value:string){
let newSize:number = parseInt(value) ;
if(newSize >= 0){
this.form.controls["someArray"] = this.fb.array(this.initFormArray(newSize))
this.form.updateValueAndValidity();
}
}
这在 Plunker 中有说明,但我不妨在这里提一下,订阅 FormArray 的 valueChanges 似乎没有帮助(或者我在订阅中没有做正确的事情):
this.form.controls['someArray'].valueChanges.subscribe((data) => this.form.updateValueAndValidity());
感谢任何加入的人:)
编辑 (2016-10-11):使用valueChanges 钩子让我能够虚拟地解决问题,但解决方案并不令人满意。出于这个原因,我正在编辑而不是回答我自己的问题,但如果任何模组认为这是一个有效的结论,请务必做你认为合适的事情。
至于我的“解决方案”:不是在 FormArray 或根 FormGroup 级别订阅 valueChanges,我几乎可以通过订阅组成 FormArray 的每个 FormGroup 的 valueChanges observable 来实现我想要的:
initFormArray(size:number):FormGroup[]{
let newFormArray:FormGroup[] = [] ;
for(let i = 0 ; i < size ; i++){
let formGroup = this.fb.group({
fieldA: [null, Validators.required],
fieldB: [null, Validators.required]
}) ;
formGroup.valueChanges.subscribe((data) => this.form.updateValueAndValidity());
newFormArray.push(formGroup);
}
return newFormArray;
}
通过这样做,根 FormGroup 会在 FormArray 被修改时更新,但会有延迟。例如,如果我在字段 A 中输入“123”,则根 FormGroup 值包含"fieldA":"12"。
因此我不满意的“解决方案”:通过在订阅中添加一个虚拟的 setTimeout,根 FormGroup 会完全按照我的意愿更新...除非理想情况下不需要 setTimeout。
formGroup.valueChanges.subscribe((data) => setTimeout(()=>this.form.updateValueAndValidity(), 1);
有没有办法在不求助于 setTimeout 的情况下管理这个?
更新的 Plunker:https://plnkr.co/edit/7mbTNPHjRhlU3ostf3av
【问题讨论】:
标签: angular typescript angular2-forms