Ich habe ein Problem mit ngOnChange
. Ich habe folgende Komponente:
Wenn jedoch Bedingung nur einmal überprüft wird - wenn this.users
noch nicht vom Server abgerufen wurde und daher seine Länge 0 ist. Wie kann ich eine Lösung finden, um mit dieser Art von asynchronen Eingaben umzugehen?
Das Array wird aktualisiert, wenn ich die folgenden Protokolle einstelle:
%Vor%Die Konsolenausgabe ist:
%Vor%Wenn Sie keine Logik ausführen müssen, wenn sich Ihre Eingabeeigenschaft ändert (z. B. wenn Sie nur die Eigenschaft in Vorlagenbindungen verwenden), müssen Sie nichts tun. Angular wird neue Werte automatisch von der übergeordneten zur Eingabeeigenschaft weiterleiten.
Wenn Sie eine Komponentenlogik ausführen möchten, wenn sich die Eingabeeigenschaft ändert, verwenden Sie ngOnChanges()
, das aufgerufen wird, wenn sich eine Komponenteneingabeeigenschaft ändert.
Da Angular% ===
verwendet, um Änderungen zu erkennen (na ja, es gibt auch eine spezielle Behandlung für NaN
), bedeutet dies, dass
myArray = someNewArray;
ngOnChanges()
nicht aufgerufen. Z. B. wird für eine Änderung wie myArray[0].name = newName;
, ngOnChanges()
nicht aufgerufen. myNumber = 5;
oder myNumber = newNumber
; Eine weitere Möglichkeit besteht darin, Ihre eigene Change Detection-Logik mit ngDoCheck()
zu implementieren. Siehe diese Antwort für ein Beispiel. Dieser Lebenszyklus-Hook wird "jedes Mal aufgerufen, wenn die Eingabeeigenschaften einer Komponente oder einer Direktive überprüft werden. Verwenden Sie sie, um die Änderungserkennung durch eine benutzerdefinierte Überprüfung zu erweitern" - von lifecyle hooks.md
ngOnChanges()
wird aufgerufen, wenn users
aktualisiert wird. Sie müssen nur sicherstellen, dass ein neues Array users
in der übergeordneten Komponente zugewiesen wird, anstatt ein vorhandenes Array zu füllen. Andernfalls erkennt die Änderung der Winkeländerung die Änderung nicht.
Tags und Links angular