Estoy creando una aplicación en angular. Mi servicio DocumentService contiene un BehaviorSubject de una matriz de Documentos.
documents: BehaviorSubject<Document[]>Aquí están las definiciones de las clases que tengo:
class Document { name: string files: File[]; } class File { pages: Page[]; } class Page { data: any; scale: number; } Mi pregunta es, ¿cuál es la mejor manera de actualizar la propiedad de escala en una página? Para esto tendría que bajar al documento, al archivo y luego a la página para modificarlo. Sin embargo, no puedo modificarlo en su lugar ya que tengo que usar this.documents.next(newDocumentsArray) . El problema es que la copia profunda no funciona: JSON.parse(JSON.stringify(...)) me da un error de estructura circular, mientras que las otras formas ( .map , Object.assign , ...) solo me dan superficial copias que luego modifican la página en su lugar, que es algo que no podemos hacer.
¿Algun consejo? Gracias
Si desea mantener su estructura profunda actual, deberá profundizar:
const newDocs = oldDocs.map(doc => { if (doc !== docToChange) { return doc; } else { return { ...doc, files: doc.files.map(file => ({ ...file, pages: file.pages.map(page => { // do page change here }) })) }; } }); Sugeriría un cambio a una estructura similar a una Entidad plana, donde todos los Documentos, Archivos y Páginas se almacenan por ID único en diccionarios separados, y la matriz de files de un Documento contiene los ID de sus Archivos, con lo mismo para los Archivos que se refieren a sus Paginas. ¿Tiene sentido?