Nella maggior parte dei casi vorrai usare {static: false}
. Impostandolo in questo modo, si troveranno corrispondenze di query dipendenti dalla risoluzione vincolante (come le direttive strutturali *ngIf, etc...
).
Esempio di quando usare 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;
}
Il static: false
comportamento di fallback predefinito sarà in Angolare 9. Ulteriori informazioni qui e qui
L' { static: true }
opzione è stata introdotta per supportare la creazione di viste incorporate al volo. Quando crei una vista in modo dinamico e desideri accedervi TemplateRef
, non sarai in grado di farlo ngAfterViewInit
poiché provocherà un ExpressionHasChangedAfterChecked
errore. L'impostazione del flag statico su true creerà la vista in ngOnInit.
Tuttavia:
Nella maggior parte degli altri casi, è consigliabile utilizzare la migliore pratica {static: false}
.
Tuttavia, tenere presente che l' { static: false }
opzione verrà impostata come predefinita in Angolare 9. Ciò significa che l'impostazione del flag statico non è più necessaria, a meno che non si desideri utilizzare l' static: true
opzione.
È possibile utilizzare il ng update
comando angular cli per aggiornare automaticamente la base di codice corrente.
Per una guida alla migrazione e ulteriori informazioni a riguardo, puoi consultare qui e qui
Qual è la differenza tra query statiche e dinamiche?
L'opzione statica per le query @ViewChild () e @ContentChild () determina quando saranno disponibili i risultati della query.
Con le query statiche (static: true), la query si risolve una volta creata la vista, ma prima che venga eseguito il rilevamento delle modifiche. Il risultato, tuttavia, non verrà mai aggiornato per riflettere le modifiche alla vista, come le modifiche ai blocchi ngIf e ngFor.
Con le query dinamiche (statiche: false), la query si risolve rispettivamente dopo ngAfterViewInit () o ngAfterContentInit () rispettivamente per @ViewChild () e @ContentChild (). Il risultato verrà aggiornato per le modifiche alla vista, come le modifiche ai blocchi ngIf e ngFor.