W większości przypadków będziesz chciał użyć {static: false}
. Ustawienie tego w ten sposób zapewni dopasowanie do zapytań, które zależą od rozdzielczości wiązania (jak dyrektywy strukturalne *ngIf, etc...
).
Przykład zastosowania 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;
}
static: false
Będzie domyślne zachowanie awaryjna w Kątowymi 9. Czytaj więcej tutaj i tutaj
{ static: true }
Opcja została wprowadzona w celu wspierania tworzenia osadzonych poglądy na bieżąco. Gdy tworzysz widok dynamicznie i chcesz uzyskać do niego dostęp TemplateRef
, nie będziesz w stanie tego zrobić, ngAfterViewInit
ponieważ spowoduje to ExpressionHasChangedAfterChecked
błąd. Ustawienie flagi statycznej na true spowoduje utworzenie widoku w ngOnInit.
Niemniej jednak:
W większości innych przypadków najlepszą praktyką jest użycie {static: false}
.
Pamiętaj jednak, że { static: false }
opcja zostanie ustawiona jako domyślna w Angular 9. Co oznacza, że ustawienie flagi statycznej nie jest już konieczne, chyba że chcesz użyć tej static: true
opcji.
Możesz użyć polecenia kątowego cli, ng update
aby automatycznie zaktualizować bieżącą bazę kodu.
Aby uzyskać przewodnik migracji i dodatkowe informacje na ten temat, możesz sprawdzić tutaj i tutaj
Jaka jest różnica między zapytaniami statycznymi a dynamicznymi?
Opcja statyczna dla zapytań @ViewChild () i @ContentChild () określa, kiedy wyniki zapytania będą dostępne.
W przypadku zapytań statycznych (static: true) zapytanie jest rozwiązywane po utworzeniu widoku, ale przed uruchomieniem wykrywania zmian. Jednak wynik nigdy nie będzie aktualizowany, aby odzwierciedlić zmiany w twoim widoku, takie jak zmiany bloków ngIf i ngFor.
W przypadku zapytań dynamicznych (static: false) zapytanie jest rozwiązywane po ngAfterViewInit () lub ngAfterContentInit () odpowiednio dla @ViewChild () i @ContentChild (). Wynik zostanie zaktualizowany o zmiany w twoim widoku, takie jak zmiany bloków ngIf i ngFor.