gpt4 book ai didi

Angular 形式 : value changes for each individual control

转载 作者:行者123 更新时间:2023-12-05 02:40:42 28 4
gpt4 key购买 nike

我想听取表单的值更改,但不是针对整个表单,而是仅针对已更改的表单控件。

例如,如果我的表单看起来像这样。

this.form = this._fb.group({
firstName: [''],
lastName: [''],
... // other stuff.
});

如果我然后订阅 valuechanges

this.form.valueChanges.subscribe((e) => {
console.log(e);
});

然后在表单中填写名字会打印出整个表单值对象。

{firstName: 'input', lastName: '', ...}

但我想知道的是哪个表单控件(在本例中为 firstName)在没有订阅每个单独的表单控件的情况下被更改。这样我想要的输出只有

{firstName: 'input'}

最佳答案

首先,多个AbstractControl(例如FormControl, FormGroupFormArray)在内部存储为树.

// FG - FormGroup
// FA - FormArray
// FC - FormControl

FG
/ \
FC FG
/ \
FC FA
/ | \
FC FC FC

以上片段摘自 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 ,如果我们考虑您的示例,_parent 可以在 firstName 时引用 this.form FormGroup 实例FormControl 接收一些输入。


因此,实现您正在寻找的方法是这样的:

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.controlsthis signature :

public controls: {[key: string]: AbstractControl},

关于 Angular 形式 : value changes for each individual control,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68405088/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com