Можно рассмотреть четыре варианта:
1) предоставить ControlContainer для вашего компонента с FormControlName
d.component.ts
@Component({
...
viewProviders: [
{
provide: ControlContainer,
useExisting: FormGroupDirective
}
]
})
export class DComponent implements OnInit {
Ng-run Пример
2) создать простую директиву, которая предоставляет ControlContainer
@Directive({
selector: '[provideContainer]',
providers: [
{
provide: ControlContainer,
useExisting: FormGroupDirective
}
]
})
export class ProvideContainerDirective {
}
затем поместите эту директиву где-нибудь наверху иерархии узлов в вашем
d.component.html
<ng-container provideContainer>
<input formControlName="someName">
</ng-container>
Ng-run Пример
3) использовать FormControlDirective вместо директивы FormControlName
FormControlDirective требуется FormControl экземпляр, подлежащий передаче
<input [formControl]="control">
Вы можете получить этот экземпляр либо DI:
d.component.ts
export class DComponent implements OnInit {
control;
constructor(private parentFormGroupDir: FormGroupDirective) { }
ngOnInit() {
this.control = this.parentFormGroupDir.control.get('someName');
}
Ng-Run Пример
или используйте какой-либо сервис, который связывает ваши компоненты.
d.component.ts
export class DComponent implements OnInit {
control: FormControl;
constructor(private formService: FormService) { }
ngOnInit() {
this.control = this.formService.get('someName');
}
NG-Run экзаменple
4) передать FormGroup в качестве Input для поддержки дочерних элементов или получить его через DI или службу, а затем обернуть ваш ввод [formControlName] директивой formGroup
d.component.html
<ng-container [formGroup]="formGroup">
<input formControlName="..."
</ng-container>
Ng-Run Пример