Angular动态生成表单控件时formControlName未渲染致mat-datepicker弹窗失效
问题原因及修复方案
- 模板变量与循环索引重名冲突:
*ngFor中声明的索引变量i与mat-datepicker的模板引用变量#i重名,导致 input 和 toggle 绑定的[matDatepicker]、[for]属性指向了数字类型的索引值,而非日期选择器实例,因此无法触发弹窗。 - formControlName 绑定写法不规范:文本输入框使用
formControlName="{{item.key}}"插值写法,动态绑定时可能出现失效问题,需统一改为方括号属性绑定写法。 - 前置依赖校验:需确保外层 form 标签已正确绑定
[formGroup]到组件内声明的 FormGroup 实例,且所有item.key对应的 FormControl 已提前在 FormGroup 中初始化,否则formControlName无法正常关联。
修正后代码示例
<!-- 替换yourFormGroup为你组件内实际的FormGroup变量名 --> <form [formGroup]="yourFormGroup"> <div *ngFor="let item of list; let i=index;"> <mat-form-field appearance="fill"> <mat-label>{{item.control["Caption"]}}</mat-label> <input *ngIf="item.control['Type'] == 'Text'" matInput [formControlName]="item.key" > <input *ngIf="item.control['Type'] == 'Date'" matInput [matDatepicker]="datePicker" placeholder="DD/MM/YYYY" [formControlName]="item.key" > <mat-datepicker-toggle *ngIf="item.control['Type'] == 'Date'" matSuffix [for]="datePicker"></mat-datepicker-toggle> <mat-datepicker *ngIf="item.control['Type'] == 'Date'" #datePicker></mat-datepicker> </mat-form-field> </div> </form>
内容的提问来源于stack exchange,提问作者Salman
相关产品推荐
相关产品推荐

