En la mayoría de los casos querrás usar {static: false}
. Si se configura de esta manera, se garantizará que se encuentren coincidencias de consulta que dependen de la resolución de enlace (como las directivas estructurales *ngIf, etc...
).
Ejemplo de cuándo usar static: false
:
@Component({
template: `
<div *ngIf="showMe" #viewMe>Am I here?</div>
<button (click)="showMe = !showMe"></button>
`
})
export class ExampleComponent {
@ViewChild('viewMe', { static: false })
viewMe?: ElementRef<HTMLElement>;
showMe = false;
}
El static: false
va a ser el comportamiento de reserva por defecto en angular 9. Lea más aquí y aquí
La { static: true }
opción se introdujo para admitir la creación de vistas integradas sobre la marcha. Cuando crea una vista dinámicamente y desea acceder a ella TemplateRef
, no podrá hacerlo, ngAfterViewInit
ya que provocará un ExpressionHasChangedAfterChecked
error. Establecer el indicador estático en verdadero creará su vista en ngOnInit.
Sin embargo:
En la mayoría de los otros casos, la mejor práctica es usar {static: false}
.
Sin embargo, tenga en cuenta que la { static: false }
opción se hará predeterminada en Angular 9. Lo que significa que ya no es necesario configurar el indicador estático, a menos que desee utilizar la static: true
opción.
Puede usar el ng update
comando angular cli para actualizar automáticamente su base de código actual.
Para obtener una guía de migración e incluso más información sobre esto, puede consultar aquí y aquí
¿Cuál es la diferencia entre consultas estáticas y dinámicas?
La opción estática para consultas @ViewChild () y @ContentChild () determina cuándo estarán disponibles los resultados de la consulta.
Con consultas estáticas (static: true), la consulta se resuelve una vez que se ha creado la vista, pero antes de que se ejecute la detección de cambios. Sin embargo, el resultado nunca se actualizará para reflejar los cambios en su vista, como los cambios en los bloques ngIf y ngFor.
Con consultas dinámicas (static: false), la consulta se resuelve después de ngAfterViewInit () o ngAfterContentInit () para @ViewChild () y @ContentChild () respectivamente. El resultado se actualizará para los cambios en su vista, como los cambios en los bloques ngIf y ngFor.
{ static: true }
, pero si no hay una necesidad directa de tener acceso al ViewChild en el interiorngOnInit
, solo debe usar el{ static: false }
.Entonces, como regla general, puede optar por lo siguiente:
{ static: true }
debe establecerse cuando se desea acceder alViewChild
enngOnInit
.{ static: false }
solo se puede acceder enngAfterViewInit
. Esto también es lo que quiere hacer cuando tiene una directiva estructural (es decir*ngIf
) en su elemento en su plantilla.fuente
De los documentos angulares
Puede ser una mejor idea usar
static:true
si el niño no depende de ninguna condición. Si la visibilidad del elemento cambia,static:false
puede dar mejores resultados.PD: Dado que es una característica nueva, es posible que debamos ejecutar puntos de referencia para el rendimiento.
Editar
Como lo mencionó @Massimiliano Sartoretto, github commit puede darle más información.
fuente
Vine aquí porque un ViewChild era nulo en ngOnInit después de actualizar a Angular 8.
Las consultas estáticas se completan antes de ngOnInit, mientras que las consultas dinámicas (estáticas: falsas) se completan después. En otras palabras, si un viewchild ahora es nulo en ngOnInit después de establecer static: false, debería considerar cambiar a static: true o mover el código a ngAfterViewInit.
Ver https://github.com/angular/angular/blob/master/packages/core/src/view/view.ts#L332-L336
Las otras respuestas son correctas y explican por qué este es el caso: las consultas que dependen de directivas estructurales, por ejemplo, una referencia ViewChild dentro de un ngIf, deben ejecutarse después de que se haya resuelto el condicional de esta directiva, es decir, después de la detección de cambios. Sin embargo, uno puede usar static: true de forma segura y así resolver las consultas antes de ngOnInit para referencias no verificadas. En mi opinión, este caso en particular se menciona como una excepción nula, probablemente podría ser la primera forma en que se encuentre con esta particularidad, como lo fue para mí.
fuente
ver hijo @angular 5+ token dos argumentos ('nombre de referencia local', estático: falso | verdadero)
para saber la diferencia entre verdadero y falso verifica esto
fuente
En ng8, puede establecer manualmente cuándo acceder al componente secundario en el componente primario. Cuando establece static en true, significa que el componente principal solo obtiene la definición del componente en el
onInit
gancho: por ejemplo:Si static es falso, solo obtienes la definición en ngAfterViewInit (), en ngOnInit (), obtendrás indefinición.
fuente