Je suis nouveau dans Angular 2 et j'ai décidé que la meilleure façon d'apprendre serait de parcourir les guides officiels d'Angular.
J'ai parcouru le Guide des Formulaires Réactifs https://angular.io/guide/reactive-forms
lien démo : https://stackblitz.com/angular/jammvmbrpxle
Alors que le contenu était globalement assez bon, je suis bloqué sur comment je pourrais implémenter un formulaire plus complexe. Dans l'exemple donné, chaque Héros a la possibilité d'avoir de nombreuses adresses. Une adresse elle-même est un objet plat.
Et si les Adresses avaient des informations supplémentaires telles que la couleur et le type de pièces situées à l'adresse.
export class Address {
street = '';
city = '';
state = '';
zip = '';
rooms = Room[];
}
export class Room {
type = '';
}
de sorte que le modèle de formulaire ressemblerait à ceci...
createForm() {
this.heroForm = this.fb.group({
name: '',
secretLairs: this.fb.array([
this.fb.group({
street: '',
city: '',
state: '',
zip: '',
rooms: this.fb.array([
this.fb.group({
type: ''
})]),
})]),
power: '',
sidekick: ''
});
}
EDIT - Code finalisé qui fonctionne avec ngOnChanges
hero-detail.component.ts
createForm() {
this.heroForm = this.fb.group({
name: '',
secretLairs: this.fb.array([
this.fb.group({
street: '',
city: '',
state: '',
zip: '',
rooms: this.fb.array([
this.fb.group({
type: ''
})
])
})
]),
power: '',
sidekick: ''
});
}
ngOnChanges() {
this.heroForm.reset({
name: this.hero.name,
});
this.setAddresses(this.hero.addresses);
}
setAddresses(addresses: Address[]) {
let control = this.fb.array([]);
addresses.forEach(x => {
control.push(this.fb.group({
street: x.street,
city: x.city,
state: x.state,
zip: x.zip,
rooms: this.setRooms(x) }))
})
this.heroForm.setControl('secretLairs', control);
}
setRooms(x) {
let arr = new FormArray([])
x.rooms.forEach(y => {
arr.push(this.fb.group({
type: y.type
}))
})
return arr;
}
hero-detail.component.html (la partie du tableau de formulaires imbriqués)
Adresse #{{i + 1}}
Rue :
Ville :
État :
{{state}}
Code Postal :
Pièce #{{j + 1}}
Type :
Ajouter une cachette secrète