I have changed the elements in Firebase in the Cruceros document so that instead of being descripcionQueHacer1, descripcionQueHacer2, etc., it is an array called descripcionQueHacer with all the elements but I don't know how to make it display, I had to delete some code but is still understandable,this is my code: edit-crucero.page.html <ion-header> <ion-toolbar color="primary"> <ion-buttons slot="start"> <ion-back-button defaultHref="/gestor-cruceros"></ion-back-button> </ion-buttons> <ion-title>Editar Crucero</ion-title> </ion-toolbar> </ion-header> <ion-content> <form [formGroup]="editForm" (ngSubmit)="saveChanges()"> <ion-item class="titulo" color="primary"> <ion-title>Crucero</ion-title> </ion-item> <ion-item> <ion-input label="Nombre del Crucero:" [clearInput]="true" placeholder="Añade el nombre del Crucero" name="name" formControlName="name"></ion-input> </ion-item> <ion-item class="titulo" color="primary"> <ion-title>Subtitulo</ion-title> </ion-item> <ion-item> <ion-input label="Subtitulo del Crucero" [clearInput]="true" placeholder="Añade el subtitulo del Crucero" name="subtitle" formControlName="subtitle"></ion-input> </ion-item> <ion-item class="titulo" color="primary"> <ion-title>Imagen del Crucero</ion-title> </ion-item> <ion-item> <ion-input label="Imagen del Crucero" [clearInput]="true" placeholder="Añade la imagen del Crucero" name="imagenCrucero" formControlName="imagenCrucero"></ion-input> </ion-item> <ion-item class="titulo" color="primary"> <ion-title>Descripción</ion-title> </ion-item> <ion-item> <ion-input label="Descripción del Crucero" [clearInput]="true" placeholder="Añade la descripción del Crucero" name="descripcion" formControlName="descripcion"></ion-input> </ion-item> <ion-item class="titulo" color="primary"> <ion-title>Imagen de la Descripción</ion-title> </ion-item> <ion-item> <ion-input label="Imagen de la Descripción" [clearInput]="true" placeholder="Añade la imagen de la descripcion" name="imagenDescripcion" formControlName="imagenDescripcion"></ion-input> </ion-item> <ion-item class="titulo" color="primary"> <ion-title>Título Que Hacer 1</ion-title> </ion-item> <ion-item> <ion-input label="Título Que Hacer 1" [clearInput]="true" placeholder="Añade el titulo de Que Hacer 1" name="tituloQueHacer1" formControlName="tituloQueHacer1"></ion-input> </ion-item> <ion-item class="titulo" color="primary"> <ion-title>Imagen Que Hacer 1</ion-title> </ion-item> <ion-item> <ion-input label="Imagen Que Hacer 1" [clearInput]="true" placeholder="Añade la imagen de Que Hacer 1" name="imagenQueHacer1" formControlName="imagenQueHacer1"></ion-input> </ion-item> <ion-item class="titulo" color="primary"> <ion-title>Descripción Que Hacer 1</ion-title> </ion-item> <ion-item> <ion-input label="Descripción Que Hacer 1" [clearInput]="true" placeholder="Añade la descripcion de Que Hacer 1" name="descripcionQueHacer1" formControlName="descripcionQueHacer1"></ion-input> </ion-item> <ion-button expand="full" type="submit" color="success">Guardar Cambios</ion-button> </form> </ion-content> edit-crucero.page.ts import { Component, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { IonicModule } from '@ionic/angular'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { CrucerosService } from '../cruceros.service'; @Component({ selector: 'app-edit-crucero', templateUrl: './edit-crucero.page.html', styleUrls: ['./edit-crucero.page.scss'], standalone: true, imports: [CommonModule, IonicModule, ReactiveFormsModule, RouterLink] }) export class EditCruceroPage implements OnInit { cruceroId: string = ""; crucero: any = {}; editForm: FormGroup; constructor( private activatedRoute: ActivatedRoute, private crucerosService: CrucerosService, private router: Router, private fb: FormBuilder ) { this.editForm = this.fb.group({ name: [''], subtitle: [''], imagenCrucero: [''], descripcion: [''], imagenDescripcion: [''], tituloQueHacer1: [''], imagenQueHacer1: [''], descripcionQueHacer1: [''], tituloQueHacer2: [''], imagenQueHacer2: [''], descripcionQueHacer2: [''], tituloQueHacer3: [''], imagenQueHacer3: [''], descripcionQueHacer3: [''], tituloQueHacer4: [''], imagenQueHacer4: [''], descripcionQueHacer4: [''], tituloQueHacer5: [''], imagenQueHacer5: [''], descripcionQueHacer5: [''], tituloQueHacer6: [''], imagenQueHacer6: [''], descripcionQueHacer6: [''], tituloCamarotes1: [''], descripcionCamarotes1: [''], imagenCamarotes1: [''], tituloCamarotes2: [''], descripcionCamarotes2: [''], imagenCamarotes2: [''], tituloCamarotes3: [''], descripcionCamarotes3: [''], imagenCamarotes3: [''], tituloCamarotes4: [''], descripcionCamarotes4: [''], imagenCamarotes4: [''], tituloCamarotes5: [''], descripcionCamarotes5: [''], imagenCamarotes5: [''], tituloCamarotes6: [''], descripcionCamarotes6: [''], imagenCamarotes6: [''], tituloCamarotes7: [''], descripcionCamarotes7: [''], imagenCamarotes7: [''], plano2: [''], plano3: [''], plano4: [''], plano5: [''], plano6: [''], plano7: [''], plano8: [''], plano9: [''], plano10: [''], plano11: [''], plano12: [''], plano13: [''], plano14: [''], plano15: [''], plano16: [''], plano17: [''], plano18: [''], plano19: [''], plano20: [''], lugar1: [''], lugar2: [''], lugar3: [''], lugar4: [''], lugar5: [''], lugar6: [''], lugar7: [''], lugar8: [''], precioLugar1: [''], precioLugar2: [''], precioLugar3: [''], precioLugar4: [''], precioLugar5: [''], precioLugar6: [''], precioLugar7: [''], precioLugar8: [''], puertos1: [''], puertos2: [''], puertos3: [''], puertos4: [''], puertos5: [''], puertos6: [''], puertos7: [''], puertos8: [''] }); } ngOnInit() { this.cruceroId = this.activatedRoute.snapshot.paramMap.get('id')!; this.loadCrucero(); } async loadCrucero() { try { const cruceroData = await this.crucerosService.obtenerCruceros(); this.crucero = cruceroData.find(c => c.id === this.cruceroId); if (this.crucero) { this.editForm.patchValue({ name: this.crucero.name, subtitle: this.crucero.subtitle, imagenCrucero: this.crucero.imagenCrucero, descripcion: this.crucero.descripcion, imagenDescripcion: this.crucero.imagenDescripcion, tituloQueHacer1: this.crucero.tituloQueHacer1, imagenQueHacer1: this.crucero.imagenQueHacer1, descripcionQueHacer1: this.crucero.descripcionQueHacer1, tituloQueHacer2: this.crucero.tituloQueHacer2, imagenQueHacer2: this.crucero.imagenQueHacer2, descripcionQueHacer2: this.crucero.descripcionQueHacer2, tituloQueHacer3: this.crucero.tituloQueHacer3, imagenQueHacer3: this.crucero.imagenQueHacer3, descripcionQueHacer3: this.crucero.descripcionQueHacer3, tituloQueHacer4: this.crucero.tituloQueHacer4, imagenQueHacer4: this.crucero.imagenQueHacer4, descripcionQueHacer4: this.crucero.descripcionQueHacer4, tituloQueHacer5: this.crucero.tituloQueHacer5, imagenQueHacer5: this.crucero.imagenQueHacer5, descripcionQueHacer5: this.crucero.descripcionQueHacer5, tituloQueHacer6: this.crucero.tituloQueHacer6, imagenQueHacer6: this.crucero.imagenQueHacer6, descripcionQueHacer6: this.crucero.descripcionQueHacer6, tituloCamarotes1: this.crucero.tituloCamarotes1, descripcionCamarotes1: this.crucero.descripcionCamarotes1, imagenCamarotes1: this.crucero.imagenCamarotes1, tituloCamarotes2: this.crucero.tituloCamarotes2, descripcionCamarotes2: this.crucero.descripcionCamarotes2, imagenCamarotes2: this.crucero.imagenCamarotes2, tituloCamarotes3: this.crucero.tituloCamarotes3, descripcionCamarotes3: this.crucero.descripcionCamarotes3, imagenCamarotes3: this.crucero.imagenCamarotes3, tituloCamarotes4: this.crucero.tituloCamarotes4, descripcionCamarotes4: this.crucero.descripcionCamarotes4, imagenCamarotes4: this.crucero.imagenCamarotes4, tituloCamarotes5: this.crucero.tituloCamarotes5, descripcionCamarotes5: this.crucero.descripcionCamarotes5, imagenCamarotes5: this.crucero.imagenCamarotes5, tituloCamarotes6: this.crucero.tituloCamarotes6, descripcionCamarotes6: this.crucero.descripcionCamarotes6, imagenCamarotes6: this.crucero.imagenCamarotes6, tituloCamarotes7: this.crucero.tituloCamarotes7, descripcionCamarotes7: this.crucero.descripcionCamarotes7, imagenCamarotes7: this.crucero.imagenCamarotes7, plano2: this.crucero.plano2, plano3: this.crucero.plano3, plano4: this.crucero.plano4, plano5: this.crucero.plano5, plano6: this.crucero.plano6, plano7: this.crucero.plano7, plano8: this.crucero.plano8, plano9: this.crucero.plano9, plano10: this.crucero.plano10, plano11: this.crucero.plano11, plano12: this.crucero.plano12, plano13: this.crucero.plano13, plano14: this.crucero.plano14, plano15: this.crucero.plano15, plano16: this.crucero.plano16, plano17: this.crucero.plano17, plano18: this.crucero.plano18, plano19: this.crucero.plano19, plano20: this.crucero.plano20, lugar1: this.crucero.lugar1, lugar2: this.crucero.lugar2, lugar3: this.crucero.lugar3, lugar4: this.crucero.lugar4, lugar5: this.crucero.lugar5, lugar6: this.crucero.lugar6, lugar7: this.crucero.lugar7, lugar8: this.crucero.lugar8, precioLugar1: this.crucero.precioLugar1, precioLugar2: this.crucero.precioLugar2, precioLugar3: this.crucero.precioLugar3, precioLugar4: this.crucero.precioLugar4, precioLugar5: this.crucero.precioLugar5, precioLugar6: this.crucero.precioLugar6, precioLugar7: this.crucero.precioLugar7, precioLugar8: this.crucero.precioLugar8, puertos1: this.crucero.puertos1, puertos2: this.crucero.puertos2, puertos3: this.crucero.puertos3, puertos4: this.crucero.puertos4, puertos5: this.crucero.puertos5, puertos6: this.crucero.puertos6, puertos7: this.crucero.puertos7, puertos8: this.crucero.puertos8 }); } } catch (error) { console.error('Error loading crucero:', error); } } async saveChanges() { if (this.editForm.invalid) { console.log('Formulario inválido'); return; } try { const formData = this.editForm.value; await this.crucerosService.actualizarCrucero(this.cruceroId, formData); this.router.navigate(['/gestor-cruceros']); } catch (error) { console.error('Error guardando cambios:', error); } } } cruceros.service.ts import { inject, Injectable } from "@angular/core"; import { addDoc, collection, doc, Firestore, getDoc, getDocs, orderBy, query, setDoc } from "@angular/fire/firestore"; @Injectable({ providedIn: 'root', }) export class CrucerosService { private firestore = inject(Firestore); public idCrucero: string = ""; async guardarCrucero( idCrucero: any, name: any, subtitle: any, imagenCrucero: any, descripcion: any, imagenDescripcion: any, tituloQueHacer1: any, imagenQueHacer1: any, descripcionQueHacer1: any, tituloQueHacer2: any, imagenQueHacer2: any, descripcionQueHacer2: any, tituloQueHacer3: any, imagenQueHacer3: any, descripcionQueHacer3: any, tituloQueHacer4: any, imagenQueHacer4: any, descripcionQueHacer4: any, tituloQueHacer5: any, imagenQueHacer5: any, descripcionQueHacer5: any, tituloQueHacer6: any, imagenQueHacer6: any, descripcionQueHacer6: any, tituloCamarotes1: any, descripcionCamarotes1: any, imagenCamarotes1: any, tituloCamarotes2: any, descripcionCamarotes2: any, imagenCamarotes2: any, tituloCamarotes3: any, descripcionCamarotes3: any, imagenCamarotes3: any, tituloCamarotes4: any, descripcionCamarotes4: any, imagenCamarotes4: any, tituloCamarotes5: any, descripcionCamarotes5: any, imagenCamarotes5: any, tituloCamarotes6: any, descripcionCamarotes6: any, imagenCamarotes6: any, tituloCamarotes7: any, descripcionCamarotes7: any, imagenCamarotes7: any, plano2: any, plano3: any, plano4: any, plano5: any, plano6: any, plano7: any, plano8: any, plano9: any, plano10: any, plano11: any, plano12: any, plano13: any, plano14: any, plano15: any, plano16: any, plano17: any, plano18: any, plano19: any, plano20: any, lugar1: any, lugar2: any, lugar3: any, lugar4: any, lugar5: any, lugar6: any, lugar7: any, lugar8: any, precioLugar1: any, precioLugar2: any, precioLugar3: any, precioLugar4: any, precioLugar5: any, precioLugar6: any, precioLugar7: any, precioLugar8: any, puertos1: any, puertos2: any, puertos3: any, puertos4: any, puertos5: any, puertos6: any, puertos7: any, puertos8: any ) { const obj ={ "idCrucero" : idCrucero, "name" : name, "subtitle" : subtitle, "imagenCrucero" : imagenCrucero, "descripcion" : descripcion, "imagenDescripcion" : imagenDescripcion, "tituloQueHacer1" : tituloQueHacer1, "imagenQueHacer1" : imagenQueHacer1, "descripcionQueHacer1" : descripcionQueHacer1, "tituloQueHacer2" : tituloQueHacer2, "imagenQueHacer2" : imagenQueHacer2, "descripcionQueHacer2" : descripcionQueHacer2, "tituloQueHacer3" : tituloQueHacer3, "imagenQueHacer3" : imagenQueHacer3, "descripcionQueHacer3" : descripcionQueHacer3, "tituloQueHacer4" : tituloQueHacer4, "imagenQueHacer4" : imagenQueHacer4, "descripcionQueHacer4" : descripcionQueHacer4, "tituloQueHacer5" : tituloQueHacer5, "imagenQueHacer5" : imagenQueHacer5, "descripcionQueHacer5" : descripcionQueHacer5, "tituloQueHacer6" : tituloQueHacer6, "imagenQueHacer6" : imagenQueHacer6, "descripcionQueHacer6" : descripcionQueHacer6, "tituloCamarotes1" : tituloCamarotes1, "descripcionCamarotes1" : descripcionCamarotes1, "imagenCamarotes1" : imagenCamarotes1, "tituloCamarotes2" : tituloCamarotes2, "descripcionCamarotes2" : descripcionCamarotes2, "imagenCamarotes2" : imagenCamarotes2, "tituloCamarotes3" : tituloCamarotes3, "descripcionCamarotes3" : descripcionCamarotes3, "imagenCamarotes3" : imagenCamarotes3, "tituloCamarotes4" : tituloCamarotes4, "descripcionCamarotes4" : descripcionCamarotes4, "imagenCamarotes4" : imagenCamarotes4, "tituloCamarotes5" : tituloCamarotes5, "descripcionCamarotes5" : descripcionCamarotes5, "imagenCamarotes5" : imagenCamarotes5, "tituloCamarotes6" : tituloCamarotes6, "descripcionCamarotes6" : descripcionCamarotes6, "imagenCamarotes6" : imagenCamarotes6, "tituloCamarotes7" : tituloCamarotes7, "descripcionCamarotes7" : descripcionCamarotes7, "imagenCamarotes7" : imagenCamarotes7, "plano2" : plano2, "plano3" : plano3, "plano4" : plano4, "plano5" : plano5, "plano6" : plano6, "plano7" : plano7, "plano8" : plano8, "plano9" : plano9, "plano10" : plano10, "plano11" : plano11, "plano12" : plano12, "plano13" : plano13, "plano14" : plano14, "plano15" : plano15, "plano16" : plano16, "plano17" : plano17, "plano18" : plano18, "plano19" : plano19, "plano20" : plano20, "lugar1": lugar1, "lugar2": lugar2, "lugar3": lugar3, "lugar4": lugar4, "lugar5": lugar5, "lugar6": lugar6, "lugar7": lugar7, "lugar8": lugar8, "precioLugar1": precioLugar1, "precioLugar2": precioLugar2, "precioLugar3": precioLugar3, "precioLugar4": precioLugar4, "precioLugar5": precioLugar5, "precioLugar6": precioLugar6, "precioLugar7": precioLugar7, "precioLugar8": precioLugar8, "puertos1": puertos1, "puertos2": puertos2, "puertos3": puertos3, "puertos4": puertos4, "puertos5": puertos5, "puertos6": puertos6, "puertos7": puertos7, "puertos8": puertos8 }; const Ref = collection(this.firestore, 'Cruceros'); const docRef = await addDoc(Ref, obj); this.idCrucero = docRef.id; console.log(idCrucero) } async obtenerCruceros(){ const Ref = collection(this.firestore, 'Cruceros'); const q = query(Ref, orderBy('name')); const querySnapshot = await getDocs(q); const cruceros = querySnapshot.docs.map(doc => ({ id:doc.id, ...doc.data()})); return cruceros } async actualizarCrucero(id: string, formData: any) { const cruceroRef = doc(this.firestore, 'Cruceros', id.toString()); await setDoc(cruceroRef, formData, { merge: true }); } async obtenerCruceroPorId(id: string) { const Ref = doc(this.firestore, 'Cruceros', id); const docSnap = await getDoc(Ref); if (docSnap.exists()) { return docSnap.data(); } else { console.log("No such document!"); return null; } } } Continue reading...