Angular中NgTemplateOutlet内无法访问FormControlName问题求助
解决NgTemplateOutlet动态传递formControlName的问题
问题根源
用NgTemplateOutlet渲染模板时,渲染内容会脱离原组件中formGroup指令的作用域,Angular无法自动关联到父表单组,因此会抛出formControlName must be used with a parent formGroup directive的错误;直接用formControl如果没正确传递控件实例,同样会报错。
解决方案
方案1:传递FormGroup与控件名,显式绑定formGroup
调用NgTemplateOutlet时,把当前FormGroup实例和目标控件名传入上下文,在模板内显式绑定formGroup:
<!-- 父组件模板 --> <form [formGroup]="myForm"> <ng-container *ngTemplateOutlet="fieldTemplate; context: { group: myForm, controlName: 'username' }" ></ng-container> </form> <ng-template #fieldTemplate let-group="group" let-controlName="controlName"> <div [formGroup]="group"> <input type="text" [formControlName]="controlName"> </div> </ng-template>
组件类定义FormGroup:
import { FormGroup, FormBuilder } from '@angular/forms'; @Component({...}) export class YourComponent { myForm: FormGroup; constructor(private fb: FormBuilder) { this.myForm = this.fb.group({ username: [''], email: [''] }); } }
方案2:直接传递FormControl实例到模板
若无需依赖父FormGroup,可直接把FormControl实例传入模板,用formControl绑定:
<!-- 父组件模板 --> <form [formGroup]="myForm"> <ng-container *ngTemplateOutlet="fieldTemplate; context: { control: myForm.get('email') }" ></ng-container> </form> <ng-template #fieldTemplate let-control="control"> <input type="text" [formControl]="control"> </ng-template>
关键注意点
- 确保模板上下文里的FormGroup/FormControl实例有效,不能传递
undefined或null - 使用
formControlName时,渲染模板内必须显式绑定[formGroup],明确指定父表单组,否则仍会因作用域问题报错
内容的提问来源于stack exchange,提问作者Johnson Daniel
相关产品推荐
相关产品推荐

