J'utilise le motif de forme dynamique en Angulaire avec diverses formes que nous avons. C'est un moyen pratique pour nous car nous avons seulement besoin de définir nos contrôles dans ngOnInit
et il va construire dynamiquement la forme dont nous avons besoin. Cependant, il existe certaines formes que les valeurs doivent être initialisées et certaines des valeurs peuvent être récupérées en utilisant async/await.Comment faire pour que les données asynchrones fonctionnent avec un motif de forme dynamique en angulaire
Il s'agit d'un problème avec la forme dynamique car lorsque j'initialise des données asynchrones, elle renvoie des erreurs sur la console et le formulaire n'apparaît pas sur la vue.
J'ai essayé d'ajouter async sur le ngOnInit et j'attends les données asynchrones. Comme l'exemple de code ci-dessous montre:
async ngOnInit() {
const pageUrl = await this.fooService.getTabUrl();
const security = this.barService.getSecurity();
const controls: Array<ControlBase<any>> = [
new ControlTextbox({
key: "url",
order: 0,
readonly: true,
type: "text",
value: pageUrl
}),
new ControlDropdown({
key: "security",
label: "Security",
order: 2,
options: security,
type: "dropdown",
value: security[0].id
})
];
this.controls = controls;
}
ajouter également un tuyau async sur la vue:
<form class="{{formClass}}" (ngSubmit)="onSubmit()" [formGroup]="form" role="form">
<app-form-control *ngFor="let ctrl of controls | async" [control]="ctrl | async" [form]="form | async"></app-form-control>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block" [disabled]="!form.valid">{{btnText}}</button>
</div>
</form>
Toutefois, cela ne fonctionne pas.
Pour plus de détails s'il vous plaît voir la capture d'écran.
codes supplémentaires:
export class FormControlComponent implements OnInit {
@Input() public control: ControlBase<string | boolean | undefined>;
@Input() public form: FormGroup;
constructor() { }
get valid() {
return this.form.controls[this.control.key].valid;
}
get invalid() {
return !this.form.controls[this.control.key].valid && this.form.controls[this.control.key].touched;
}
ngOnInit() { }
}
export class DynamicFormComponent implements OnInit {
@Input() public controls: Array<ControlBase<any>> = [];
@Input() public btnText = "Submit";
@Output() public formSubmit: EventEmitter<any> = new EventEmitter<any>();
public form: FormGroup;
constructor(public _controlService: FormControlService) { }
ngOnInit() {
const sortedControls = this.controls.sort((a, b) => a.order - b.order);
this.form = this._controlService.toControlGroup(sortedControls);
}
onSubmit(): void {
this.formSubmit.emit(this.form.value);
}
}
export class FormControlService {
constructor() { }
public toControlGroup(controls: Array<ControlBase<any>>) {
const group: any = {};
controls.forEach(control => {
const validators: any = [];
// Required
if (control.required) {
validators.push(Validators.required);
}
// remove for brevity
group[control.key] = new FormControl(control.value || "", validators);
});
return new FormGroup(group);
}
}
Je suis encore nouveau et l'apprentissage angulaire. Toute suggestion sur la façon dont je vais surmonter le problème lors de l'initialisation des données asynchrones?
Qu'est-ce que votre 'FormControlService.toControlGroup () 'retour? On dirait que votre formulaire doit être un 'FormGroup' mais c'est quelque chose d'autre. Je reçois généralement cette erreur lorsque j'ajoute '[formGroup] =" form "' à mon formulaire, où 'form' n'est pas défini sur la bonne valeur/type. Assurez-vous également que les contrôles que vous bouclez ont également un ensemble '[formGroup]' approprié, car ils en ont besoin également et cette erreur peut être levée pour ceux-là aussi. – Lansana
@Lansana J'ai mis à jour ma question – rpmansion