In den meisten Fällen möchten Sie verwenden {static: false}
. Wenn Sie dies so einstellen, wird sichergestellt, dass Abfrageübereinstimmungen gefunden werden, die von der Bindungsauflösung abhängen (z. B. strukturelle Anweisungen *ngIf, etc...
).
Beispiel für die Verwendung 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;
}
Das static: false
wird die Standard - Ausweichverhalten in Angular 9. Lesen Sie mehr sein hier und hier
Die { static: true }
Option wurde eingeführt, um das Erstellen eingebetteter Ansichten im laufenden Betrieb zu unterstützen. Wenn Sie eine Ansicht dynamisch erstellen und auf die zugreifen möchten TemplateRef
, können Sie dies nicht tun, ngAfterViewInit
da dies zu einem ExpressionHasChangedAfterChecked
Fehler führt. Wenn Sie das statische Flag auf true setzen, wird Ihre Ansicht in ngOnInit erstellt.
Dennoch:
In den meisten anderen Fällen ist die beste Vorgehensweise die Verwendung {static: false}
.
Beachten Sie jedoch, dass die { static: false }
Option in Winkel 9 als Standard festgelegt wird. Dies bedeutet, dass das Setzen des statischen Flags nicht mehr erforderlich ist, es sei denn, Sie möchten die static: true
Option verwenden.
Mit dem ng update
Befehl angle cli können Sie Ihre aktuelle Codebasis automatisch aktualisieren.
Einen Migrationsleitfaden und noch mehr Informationen dazu finden Sie hier und hier
Was ist der Unterschied zwischen statischen und dynamischen Abfragen?
Die statische Option für @ ViewChild () - und @ ContentChild () -Abfragen bestimmt, wann die Abfrageergebnisse verfügbar werden.
Bei statischen Abfragen (static: true) wird die Abfrage aufgelöst, sobald die Ansicht erstellt wurde, jedoch bevor die Änderungserkennung ausgeführt wird. Das Ergebnis wird jedoch niemals aktualisiert, um Änderungen an Ihrer Ansicht widerzuspiegeln, z. B. Änderungen an den Blöcken ngIf und ngFor.
Bei dynamischen Abfragen (statisch: false) wird die Abfrage entweder nach ngAfterViewInit () oder ngAfterContentInit () für @ViewChild () bzw. @ContentChild () aufgelöst. Das Ergebnis wird aktualisiert, um Änderungen an Ihrer Ansicht vorzunehmen, z. B. Änderungen an den Blöcken ngIf und ngFor.