View/Content queries
En esta sección vamos a ver como referenciar elementos de la plantilla desde el componente. Ya sean elementos definidos en la propia plantilla o proyectados en el componente.
viewChild y viewChildren
Con viewChild podemos hacer referencia a un elemento de la plantilla. Para ello, si es un componente o directiva de Angular, podemos utilizarlo en combinación con la clase que representa dicho componente/directiva. Nos devolverá la referencia al componente dentro de una signal.
Otra forma de acceder a un elemento es creando una referencia con # en la plantilla (esto nos permite identificar a un componente o directiva específico cuando hay varios del mismo tipo). También se puede utilizar para referenciar elementos HTML nativos. En este caso tendremos que tipar utilizando genéricos el tipo de objeto que vamos a referenciar (ElementRef en el caso de elemento HTML nativos).
La función viewChildren actua de manera similar pero te referencia un array con todos los componentes o directivas del mismo tipo que encuentra en la plantilla (también se pueden utilizar varias referencias '#' bajo el mismo nombre).
Es importante saber que hasta que no se haya renderizado por primera vez la plantilla, no tendremos acceso a los objetos referenciados. Para evitar problemas podemos utilizar las funciones computed, effect o linkedSignal para procesar dichos elementos. Otra forma sería utilizar el método ngAfterViewInit del ciclo de vida, o mejor aún, la nueva función afterNextRender, que se integra mejor con Angular SSR (que veremos en breve).
Ejemplo: Referenciar formulario de plantilla
Para referenciar el formulario de plantilla en el componente, habría que referenciar su directiva NgForm. Ahí es donde podemos consultar tanto el valor como el estado del fomulario, resetearlo, etc.
Si en nuestro componente hay un solo formulario podríamos utilizar NgForm directamente para indicar lo que queremos a la función viewChild. Otra opción es crear una referencia en la plantilla a la directiva, y usar el nombre de la referencia. Esto segundo sería útil para referencia un campo (NgModel) ya que con mucha probabilidad sea una directiva repetida en la plantilla.
Al tener la referencia, podríamos hacer cosas como validar el formulario antes de enviarlo, controlar los cambios de valor con el observable valueChanges, etc.
Además, en este caso también podríamos mejorar la eficiencia del guard de tipo CanDeactivate para que no nos pregunte cuando el formulario no ha sido modificado (pristine). Esto con formularios reactivos es directo, pero con formularios de plantilla necesitamos crear la referencia en el componente.
Ejemplo: Campo de búsqueda con debounceTime
Igual que vimos en la sección correspondiente de los formularios reactivos donde implementabamos un campo de texto que filtraba productos pasados 600 milisegundos desde que el usuario deja de escribir. Se puede hacer lo mismo con formularios de plantilla si referenciamos la directiva ngModel en el componente con viewChild.
La solución anterior tiene un pequeño problema. La carga inicial del productos no se haría hasta 600 ms después de renderizar la plantilla. Esto se podría paliar llamando al servicio aparte en el constructor (fuera de la función afterNextRender).
También se puede utilizar un enfoque más orientado a señales. En este caso no necesitaríamos la referencia viewChild.
Otra opción sería utilizar la API rxResource de Angular 19:
contentChild y contentChildren
contentChild es similar a viewChild pero hace referencia a contenido proyectado en el componente actual.
Para el siguiente ejemplo vamos a ver como si le pasamos un icono (Vamos a usar FontAwesome icons para el ejemplo) al botón, en lugar de mostar la animación de carga en el centro del botón, sustituiremos las clases del icono para que se muestre un icono de carga animado en su lugar. SI no recibimos un icono, se comportará como antes.


El uso de contentChildren es análogo a viewChildren para contenido que se repite, devuelve una colección de tipo QueryList.