Cette solution est née de la discussion dans le référentiel Angular. N'hésitez pas à le lire ou, mieux encore, à y participer si vous êtes intéressé par ce problème.
J'ai étudié le code de FormControlName
et cela m'a inspiré pour écrire la solution suivante :
@Component({
selector: 'my-custom-form-component',
templateUrl: './custom-form-component.html',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: CustomFormComponent,
multi: true
}]
})
export class CustomFormComponent implements ControlValueAccessor, OnInit {
@Input() formControlName: string;
private control: AbstractControl;
constructor (
@Optional() @Host() @SkipSelf()
private controlContainer: ControlContainer
) {
}
ngOnInit () {
if (this.controlContainer) {
if (this.formControlName) {
this.control = this.controlContainer.control.get(this.formControlName);
} else {
console.warn('Missing FormControlName directive from host element of the component');
}
} else {
console.warn('Can\'t find parent FormGroup directive');
}
}
}
J'injecte le parent FormGroup
au composant et ensuite obtenir le FormControl
à partir de celui-ci en utilisant le nom du contrôle obtenu par formControlName
la reliure.
Toutefois, il faut savoir que cette solution est conçue spécifiquement pour le cas d'utilisation où FormControlName
est utilisée sur l'élément hôte. Elle ne fonctionnera pas dans les autres cas. Pour cela, vous devrez ajouter une logique supplémentaire. Si vous pensez que ce problème devrait être résolu par Angular, consultez le site suivant la discussion .