Mi aplicación permite actualizar la lista de propiedades para muchos objetos. Algunos de los tipos de propiedades son opcionales, y algunos tienen más de miles de opciones.
Para lograr un buen rendimiento, envolví MatSelect
para que cargue más opciones en el desplazamiento.
En la primera carga, no estoy cargando ninguna opción de la lista, sino solo una opción con el valor actual de la propiedad. Con el fin de mostrar al usuario el valor de la propiedad.
Para usar mi MatSelect
en un formulario, he usado viewProviders
de la siguiente manera:
viewProviders: [ { provide: ControlContainer, useFactory: (container: ControlContainer) => container, deps: [[new SkipSelf(), ControlContainer]] } ]
Entonces, mi objetivo es que, siempre que el usuario no abra ninguna lista, no cargará ninguna opción.
Cuando el usuario presiona sobre un objeto de la lista, se genera un nuevo formGroup
, las propiedades se muestran según sus tipos. uno de los tipos son Options
que usan mi componente personalizado. Mi MatSelect
se carga por primera vez y agrega el primer valor, que es el valor de la propiedad. En el segundo objeto, se crea un nuevo formGroup
, se muestran las propiedades (si es el mismo tipo de objeto, entonces las mismas propiedades, con diferentes valores). Pero esta vez no está llegando al código en mi contenedor MatSelect
que realiza el proceso inicial, porque Angular reutiliza el elemento DOM anterior y no crea uno nuevo ni desecha el anterior, y mi @Input
es el mismo.
Eso hace que mi MatSelect
esté vacío, porque ahora solo tiene una opción: la del primer objeto.
¿Hay alguna forma o evento de saber cuándo Angular está reutilizando el elemento/componente DOM para que pueda ejecutar mi código inicial una y otra vez? Probé muchos de los métodos del ciclo de vida, sin suerte. ¿O tal vez el peor de los casos hace que mi MatSelect
no sea reutilizable de alguna manera y provoque la recreación del componente?
Como solución, estoy clonando el objeto que estoy enviando a mi MatSelect
como objeto @Input
, así que lo atraparé en mi propiedad set
, pero debe ser una mejor manera.