Tengo una QueryList en un componente. Estoy agregando dinámicamente otros componentes, que estarán presentes en QueryList , pero si me suscribo a los changes de QueryList , no pasa nada. Pensé que era porque me suscribí a ngAfterViewInit , pero QueryList aún no está undefined en ngOnInit .
código:
@Component({ ... }) export class AppComponent { @ViewChildren(ControlFactoryDirective) factories: QueryList<ControlFactoryDirective> ngAfterViewInit() { this.factories.changes.subscribe(() => { console.log('changed') }) } }La cuestión es que la lista que llega a la propiedad de su factories ya está precargada. Por lo tanto, simplemente no tiene la oportunidad de suscribirse a sus cambios antes de que se complete por primera vez. Pero, por supuesto, todos los cambios que suceden más tarde llegan a su suscriptor.
Aquí está el plunkr con su ejemplo actualizado: tenga en cuenta que las fábricas ahora tienen un configurador que demuestra que está precargado (normalmente no lo necesita en una aplicación real, eso es solo para averiguar qué valor proviene del marco)
Creo que es un comportamiento totalmente válido. Entonces, en ngAfterViewInit , recorra los valores en QueryList y haga lo mismo que está a punto de hacer en el suscriptor:
ngAfterViewInit() { this.processChildren(); // first call to processChildren this.factories.changes.subscribe(_ => this.processChildren() // subsequent calls to processChildren ); } private processChildren(): void { console.log('Processing children. Their count:', this.factories.toArray().length) }Después de realizar un cambio en los objetos de la lista de consultas, debe llamar a la lista de consultas para notificar los cambios.
update() { this.factories.forEach(factory => { console.log(factory.componentRef.instance.model.data = "alma") // factory.() this.factories.notifyOnChanges(); }) }También puede agregar startWith(undefined) así:
ngAfterViewInit() { this.factories.changes.pipe(startWith(undefined)).subscribe(() => { console.log('changed') }) }Esto activará el controlador de suscripción inmediatamente.