首先,多个AbstractControls(例如FormControl,FormGroup,FormArray)在内部存储为一棵树。
// FG - FormGroup
// FA - FormArray
// FC - FormControl
FG
/ \
FC FG
/ \
FC FA
/ | \
FC FC FC
以上sn-p摘自A thorough exploration of Angular Forms。
由于这个原因,FormGroup.valueChanges 会在 FormGroup 孩子的 valueChanges 发出时发出:
updateValueAndValidity (/* ... */) {
/* ... */
if (opts.emitEvent !== false) {
(this.valueChanges as EventEmitter<any>).emit(this.value);
(this.statusChanges as EventEmitter<string>).emit(this.status);
}
if (this._parent && !opts.onlySelf) {
this._parent.updateValueAndValidity(opts);
}
/* ... */
}
在above snippet 中,如果我们考虑您的示例,当firstName FormControl 收到一些输入时,_parent 可以引用this.form FormGroup 实例。
因此,实现您正在寻找的方法是这样的:
merge(
...Object.keys(this.form.controls).map(
k => this.form.controls[k].valueChanges.pipe(
// Getting a decent format: `{ formControlName: formControlValue }`
map(v => ({ [k]: v })),
)
)
).subscribe(console.log)
FormGroup.controls 有this signature:
public controls: {[key: string]: AbstractControl},