Tengo un componente, creando otro componente con ComponentFactoryResolver. Parece funcionar bien, puedo acceder a los datos a través de @Input. El problema es que nunca se llama a ngOnChanges cuando se inicia el componente o cuando cambian los datos. Sin embargo, se dispara si creo el componente de la manera normal, con su selector en HTML. Sin embargo, eso no es dinámico, así que me quedo con ComponentFactoryResolver. ¿Es este comportamiento normal?
Mi componente principal tiene su entrada:
@ViewChild( MiDirectiva ) miHost: MiDirectiva;
Luego crea componentes secundarios cuyas entradas son así:
@Input('key') key: String; @Input('index') index: number;y estoy creando el componente así:
let item = new Item(ItemDropdownComponent, this.key, 0); let componentFactory = this._componentFactoryResolver.resolveComponentFactory(item.component); let viewContainerRef = this.myHost.viewContainerRef; viewContainerRef.clear(); let componentRef = viewContainerRef.createComponent(componentFactory); (<ItemInterfaceComponent>componentRef.instance).key = item.key; (<ItemInterfaceComponent>componentRef.instance).index = item.index;Ese es el comportamiento esperado. Sin embargo, puede invocar la detección de cambios explícitamente
componentRef.changeDetectorRef.detectChanges();Si ejecuta la detección de cambios manualmente, tenga en cuenta que se ejecutará para el componente y todos sus elementos secundarios, es decir, la rama completa. Por lo tanto, debe pensar en separar a otros niños al crear uno nuevo.
Este problema se rastrea en: https://github.com/angular/angular/issues/22010