【发布时间】:2023-03-05 22:32:02
【问题描述】:
我已经使用 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 类似对象的数组?
【问题讨论】:
标签: javascript angular forms formarray