我使用ControlValueAccessor构建了一个自定义输入组件,可以很好地添加标签作为选择项。(Stackblitz)
我的问题是:
- 当我在表单中实现该组件(城市和州控件)时
- 通过选择某些选项向两个控件添加值
- 提交表单
- 有时控件值是所选标签的数组(如预期的那样)
- 其他时候它是一个实际的FormArray对象
这是相同组件的两个值在提交angular表单后的截图。一个是对象数组(预期的),另一个是实际的FormArray对象,其中.value属性包含对象数组!
如果您不想访问StackBlitz,则可以查看以下一些代码。
自定义控件的实现方式如下。
this.form = this.fb.group({
tags: this.fb.array([])
});
当用户选择下拉菜单项或按下回车键时,对象会被保存如下:
get tagsArray(): FormArray { return this.form.get('tags') as FormArray; }
...
this.tagsArray.push(new FormControl(value));
this.onChange(this.tagsArray); // update controller value
你可以通过在一个类似于我的 StackBlitz 中的 formGroup 中实现该组件来复制它(也可以在我的 StackBlitz 中进行操作)。表单初始化。
public form: FormGroup = this.fb.group({
states: [],
cities: []
});
模板
<input-tags formControlName="cities" label="Cities" [typeAhead]="cities" [displayKeys]="['name']" filterKeys="['name']"></input-tags>
<input-tags formControlName="states" label="States" [typeAhead]="states" [displayKeys]="['name']" filterKeys="['name']"></input-tags>
但问题是:
何时 Angular 的 FormArray 是传统数组,何时它是类似于 FormArray 的数组对象?
[]
值,有时候具有FormArray{}
值,就像屏幕截图所示的那样。 - Ben RacicotFormArray
值。添加的任何值都通过相同的addTag
方法进行处理。这就是为什么这没有意义的原因。您能否更详细地解释一下您建议的registerOnChange重构?顺便说一句,谢谢您。 - Ben RacicotControlValueAccessor
的基本方法,用于定义应获取值以将其分配给主表单的函数。有关更多信息,请阅读此处 https://angular.io/api/forms/ControlValueAccessor - SergeyFormArray
对象推入主表单中没有意义,因为它会破坏逻辑并引起一些问题。当我实现这些ControlValueAccessor
时,我只使用简单的值(即不是AbstractControl
的子类),一切都工作得很好。 - Sergey