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

Angular响应式表单FormArray结合Material报错:control.setValidators不是函数

问题根源

报错control.setValidators is not a function的核心原因是filter输入框的表单绑定方式和组件里的FormControl定义不匹配:
要是你在组件里单独声明了filterControl: FormControl = new FormControl(''),但模板里给这个输入框用了formControlName="filter",可这个filter根本没被注册到外层的FormGroup里,Angular就会在当前上下文乱找,最后拿到的不是合法的FormControl实例,调用setValidators的时候自然就报错了。

修复方法

根据你组件里的FormControl定义,选对应的绑定方式就行:

  • 把filter并入主FormGroup
    组件里构建主表单时,把filter作为FormControl加进去:

    myForm = this.fb.group({
      filter: [''], // 添加filter控件
      items: this.fb.array([]) // FormArray部分不用改
    });
    

    模板里确保输入框在<form [formGroup]="myForm">范围内,用formControlName="filter":

    <input matInput formControlName="filter" placeholder="Filter">
    
  • 直接绑定独立的FormControl
    要是不想把filter放进主FormGroup,模板里就用[formControl]绑定组件里单独声明的控件:
    组件里:

    filterControl = new FormControl('');
    

    模板里:

    <input matInput [formControl]="filterControl" placeholder="Filter">
    
是不是Bug?

这不是Angular或Angular Material的Bug,就是表单绑定的使用错误。Angular要求formControlName必须对应当前FormGroup/FormArray里已经注册好的控件,不然就会找不到合法的FormControl实例,触发这类方法调用错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:05:51