3 回答
TA贡献1799条经验 获得超6个赞
一个简单的解决方案是提供ControlContainer在viewProviders像你的孩子组成的数组:
import { ControlContainer, NgForm } from '@angular/forms';
@Component({
...,
viewProviders: [ { provide: ControlContainer, useExisting: NgForm } ]
})
export class ChildComponent {}
Stackblitz示例
另请阅读这篇文章,解释其为何起作用。
Angular:嵌套模板驱动形式
更新资料
如果您正在寻找嵌套模型驱动的表单,那么这里是类似的方法:
@Component({
selector: 'my-form-child',
template: `<input formControlName="age">`,
viewProviders: [
{
provide: ControlContainer,
useExisting: FormGroupDirective
}
]
})
export class ChildComponent {
constructor(private parent: FormGroupDirective) {}
ngOnInit() {
this.parent.form.addControl('age', new FormControl('', Validators.required))
}
}
Ng运行示例
更新2
如果您不知道确切的ControlContainer包装类型是您的自定义组件(例如,控件位于FormArray指令内),则只需使用通用版本:
import { SkipSelf } from '@angular/core';
import { ControlContainer} from '@angular/forms';
@Component({
...,
viewProviders: [{
provide: ControlContainer,
useFactory: (container: ControlContainer) => container,
deps: [[new SkipSelf(), ControlContainer]],
}]
})
export class ChildComponent {}
TA贡献1841条经验 获得超3个赞
另一个可能的解决方法:
@Directive({
selector: '[provide-parent-form]',
providers: [
{
provide: ControlContainer,
useFactory: function (form: NgForm) {
return form;
},
deps: [NgForm]
}
]
})
export class ProvideParentForm {}
只需将此指令放在子组件中节点层次结构顶部的某个位置(在任何ngModel之前)。
工作原理:NgModel 使用@Host()限定父窗体的依赖关系查找。因此,父组件中的表单对于子组件中的NgModel不可见。但是我们可以使用上面演示的代码将其注入并提供给子组件。
- 3 回答
- 0 关注
- 713 浏览
添加回答
举报