Sé que probablemente podría haber una mejor manera de hacer esto, pero quiero entender cómo resolver este tipo de problema. Tengo dos clases, Parent e Child . Parent tiene una variedad de niños.
Creé los métodos addChild y removeChild que me permiten crear un Child y eliminarlo y ambos me devuelven el objeto Parent actualizado (lo necesito porque actualizará una variable de estado de React en otro lugar)
Quiero pasar a cada hijo un método "eliminar" para eliminarlo de su padre. Esto realmente funciona bien en un padre preestablecido con hijos. Pero si agrego muchos hijos y luego trato de eliminar uno, cada vez que vuelvo a la condición inicial (digamos, Parent inicialmente tiene 4 hijos, agrego 3 más, ahora son 7. Elimino uno y vuelvo a 4 .).
Creo que esto sucede porque cuando le paso el controlador al objeto Child que estoy creando en addChild , la función removeChild que incrusto en el objeto child no se actualiza y se refiere a la versión inicial del objeto Parent , pero no sé cómo para arreglar esto.
Adjunto aquí un pseudocódigo, solo para dar una idea del problema.
Cualquier ayuda sería apreciada.
import _ from "lodash"; class Parent{ constructor(){ this.removeChild.bind(this); } children: Child[]; addChild(){ const newParent = _.cloneDeep(this); newParent.children = [ ...newParent.children, new Child({remove: this.removeChild}) ] return newParent; } removeChild(child){ const newParent = _.cloneDeep(this); newParent.children = newParent.filter(child => (child.id != child.id)); return newParent; } } class Child{ id; remove(); constructor({remove}){ this.id = automaticgenerated this.remove = remove } }¿Te refieres a algo como esto?
class Parent { constructor() { this.children = []; } addChild(child) { child.parent = this; this.children.push(child); return this; } removeChild(child) { child.parent = null; this.children = this.children.filter(c => c.id != child.id); return this; } } class Child { constructor() { this.parent = null; this.id = Math.random(); //Fake auto generated id } remove() { this.parent.removeChild(this); this.parent = null; } } const p = new Parent(); const c1 = new Child(); const c2 = new Child(); console.log(p.addChild(c1)); console.log(p.addChild(c2)); console.log(p.removeChild(c2)); c1.remove(); console.log(p);