You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 10升级至15后出现Cannot find control with path错误

Angular 10迁移至15后表单控件路径错误解决方案

问题现象

项目从Angular 10升级到Angular 15后,控制台抛出错误:

ERROR Error: Cannot find control with path: 'mappedHeaders -> 0 -> value'

原代码在Angular 10中可正常运行,升级后出现上述控件路径找不到的问题。

相关代码

example.ts

headerArray: FormArray;
formGroup: FormGroup;

constructor(private fb: FormBuilder) {
    this.headerArray = this.fb.array([]);
    this.formGroup = this.fb.group({
      mappedHeaders: this.headerArray
    });
}

// 网络请求完成后推入控件的代码
const mapped = result['mappedHeaders'];
for (const accountHeader of this.accountHeaders.sort()) {
    this.headerArray.push(this.fb.control({
        key: accountHeader,
        value: mapped[accountHeader]
    }));
}

example.html

<div [formGroup]="formGroup">
    <table>
        <tbody formArrayName="mappedHeaders">
            <ng-container *ngFor="let header of accountHeaders; index as i">
                <tr>
                    <td>{{i}}</td>
                    <td [formGroupName]="i">
                        <select class="ui fluid clearable selection search dropdown column-mapping-dropdown" formControlName="value">
                            <option *ngFor="let header of fileHeaders" [value]="header">{{ header }}</option>
                        </select>
                    </td>
                </tr>
            </ng-container>
        </tbody>
    </table>
</div>

问题原因

核心矛盾在于FormArray元素类型与模板绑定语法不匹配:

  • 代码中向headerArray(FormArray)推入的是FormControl(通过fb.control()创建),每个控件包裹了一个包含key和value的对象;
  • 但模板中使用了[formGroupName]="i",这个语法是用来绑定FormGroup的,Angular会尝试在FormArray的第i个元素(FormControl)中查找名为value的子控件,自然找不到,从而抛出路径错误。

Angular 10对这种不规范的写法兼容性较强,未严格校验控件类型匹配,但Angular 15的表单模块收紧了校验规则,因此触发错误。

解决方案

将FormArray中的元素从FormControl改为FormGroup,确保模板的formGroupName绑定对应正确的控件类型:

修改推入控件的代码:

const mapped = result['mappedHeaders'];
for (const accountHeader of this.accountHeaders.sort()) {
    this.headerArray.push(this.fb.group({
        key: [accountHeader],
        value: [mapped[accountHeader]]
    }));
}

这样每个FormArray元素都是包含key和value两个FormControl的FormGroup,模板中的[formGroupName]="i"和formControlName="value"就能正确匹配到对应的控件,错误即可解决。

内容的提问来源于stack exchange,提问作者Niamatullah Bakhshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:20:14