Je dispose d'une FormFieldComponent
qui encapsule le HTML et la logique d'affichage des erreurs pour un champ de formulaire :
@Component({
selector: 'field',
template: `
<div class="form-group">
<label class="control-label">{{label}}</label>
<ng-content></ng-content> <!-- Will display the field -->
<!-- Here, put error display logic -->
</div>
`
})
export class FormFieldComponent {
@Input() label: string; // Field label
@Input() theControl: FormControl; // Current form control, required to display errors
}
En FormFieldComponent
J'ai besoin d'une instance du FormControl pour afficher les erreurs.
Mon formulaire ressemble alors à ceci :
<form [formGroup]="myForm">
...
<field label="Title" [theControl]="myForm.get('title')">
<input type="text" formControlName="title">
</field>
...
</form>
Mais je ne suis pas entièrement satisfait du code ci-dessus. Comme vous pouvez le constater, je spécifie la clé du champ à deux endroits : dans le champ [theControl]
et dans la propriété de l'entrée formControlName
directive.
Le code serait plus concis si je pouvais simplement écrire :
<field label="Title">
<input type="text" formControlName="title">
</field>
Remarquez comment le [theControl]
La propriété d'entrée a disparu. Le site FieldComponent
devrait être capable de mettre la main sur l'instance de FormControl qu'il contient, mais comment ?
J'ai essayé d'utiliser le @ContentChildren
pour rechercher les directives FormControl dans le modèle du composant, mais cela ne fonctionne pas :
export class FormFieldComponent {
@ContentChildren(FormControlDirective) theControl: any;
}
Une autre option consisterait à transmettre la clé du champ en tant qu'entrée à la fonction FormFieldComponent
et ensuite laisser le composant utiliser cette clé pour :
- Appliquer de manière programmatique le
formControlName
au champ qu'il contient. - Mettre la main sur son parent
<form>
accéder à l'instance FormGroup correspondante, et extraire l'instance FormControl de celle-ci.