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

Angular 14动态生成表单控件时出现feature_r5.get不是函数错误

Angular v14动态表单控件报错解决:TypeError: feature.get is not a function

错误原因

你在*ngFor里遍历的是advForm.get('features')?.value,这是表单数组的原始值对象,并非FormGroup实例,所以调用get()方法会触发报错。

修复步骤

1. 修正*ngFor遍历对象

把遍历目标从表单值改成表单数组的控件集合:

<div formArrayName="features" *ngFor="let feature of advForm.get('features')?.controls; let i = index">

如果担心空值问题,也可以用advForm.controls['features']?.controls,或者添加非空断言(前提是组件中已正确初始化FormArray)。

2. 优化formGroupName绑定写法

将插值语法改为属性绑定,更符合Angular规范:

<div [formGroupName]="i">

替代原来的attr.formGroupName="{{i}}"。

3. 完善表单控件状态判断逻辑

现在feature是FormGroup实例,可正常调用get()方法,建议添加安全导航操作符?.避免空值报错:

<div class="form-group" [ngClass]="{'has-error' : feature.get('fName')?.invalid && feature.get('fName')?.touched}">
<!-- ... -->
<span class="help-block" *ngIf="feature.get('fName')?.errors?.required && feature.get('fName')?.touched">
    Feature is required
</span>

4. 确保组件中FormArray初始化正确

组件内的addFeatureButtonClick()方法要正确向FormArray添加FormGroup实例,示例:

addFeatureButtonClick() {
  const features = this.advForm.get('features') as FormArray;
  features.push(this.formBuilder.group({
    fName: ['', Validators.required]
  }));
}

同时初始化表单时要正确创建FormArray:

this.advForm = this.formBuilder.group({
  // 其他表单控件
  features: this.formBuilder.array([])
});

完整修复后的HTML模板片段

<div id="features" class="tab-pane mytab-pane">
    <div class="form-group">
        <button type="button" class="btn btn-primary" (click)="addFeatureButtonClick()">Add</button>
    </div>

    <div formArrayName="features" *ngFor="let feature of advForm.get('features')?.controls; let i = index">
        <div [formGroupName]="i">
            <div class="form-group" [ngClass]="{'has-error' : feature.get('fName')?.invalid && feature.get('fName')?.touched}">
                <div class="input-group">
                    <span class="input-group-prepend">
                        <label class="input-group-text"><strong>Features</strong></label>
                    </span>
                    <input type="text" id="{{'fName'+i}}" name="fName" class="form-control" placeholder="Features"
                        formControlName="fName"/>
                </div>
                <span class="help-block" *ngIf="feature.get('fName')?.errors?.required && feature.get('fName')?.touched">
                    Feature is required
                </span>
            </div>
        </div>
    </div>
</div>

内容的提问来源于stack exchange,提问作者Junior Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:43:20