Tatsächlich gibt es zwei Möglichkeiten, um zu erkennen und darauf zu reagieren, wenn sich eine Eingabe in der untergeordneten Komponente in angle2 + ändert:
- Sie können die Lebenszyklusmethode ngOnChanges () verwenden, wie auch in älteren Antworten erwähnt:
@Input() categoryId: string;
ngOnChanges(changes: SimpleChanges) {
this.doSomething(changes.categoryId.currentValue);
// You can also use categoryId.previousValue and
// categoryId.firstChange for comparing old and new values
}
Dokumentationslinks: ngOnChanges, SimpleChanges, SimpleChange
Demo Beispiel: Sehen Sie sich diesen Plunker an
- Alternativ können Sie auch einen Eingabe-Eigenschaften-Setter wie folgt verwenden:
private _categoryId: string;
@Input() set categoryId(value: string) {
this._categoryId = value;
this.doSomething(this._categoryId);
}
get categoryId(): string {
return this._categoryId;
}
Dokumentationslink: Schauen Sie hier .
Demo-Beispiel: Sehen Sie sich diesen Plunker an .
Welchen Ansatz sollten Sie verwenden?
Wenn Ihre Komponente mehrere Eingaben hat, erhalten Sie bei Verwendung von ngOnChanges () alle Änderungen für alle Eingaben gleichzeitig in ngOnChanges (). Mit diesem Ansatz können Sie auch aktuelle und vorherige Werte der geänderten Eingabe vergleichen und entsprechende Maßnahmen ergreifen.
Wenn Sie jedoch etwas tun möchten, wenn sich nur eine bestimmte Eingabe ändert (und Sie sich nicht um die anderen Eingaben kümmern), ist es möglicherweise einfacher, einen Eingabe-Eigenschaftssetzer zu verwenden. Dieser Ansatz bietet jedoch keine integrierte Möglichkeit, frühere und aktuelle Werte der geänderten Eingabe zu vergleichen (was mit der ngOnChanges-Lebenszyklusmethode problemlos möglich ist).
EDIT 2017-07-25: ANGULAR CHANGE DETECTION KANN UNTER EINIGEN UMSTÄNDEN NOCH NICHT FEUERN
Normalerweise wird die Änderungserkennung sowohl für Setter als auch für ngOnChanges ausgelöst, wenn die übergeordnete Komponente die Daten ändert, die an das untergeordnete Element übergeben werden, vorausgesetzt, die Daten sind ein primitiver JS-Datentyp (Zeichenfolge, Zahl, Boolescher Wert) . In den folgenden Szenarien wird es jedoch nicht ausgelöst und Sie müssen zusätzliche Maßnahmen ergreifen, damit es funktioniert.
Wenn Sie ein verschachteltes Objekt oder Array (anstelle eines primitiven JS-Datentyps) verwenden, um Daten von Parent zu Child zu übergeben, wird die Änderungserkennung (entweder mit Setter oder ngchanges) möglicherweise nicht ausgelöst, wie auch in der Antwort des Benutzers: muetzerich erwähnt. Lösungen finden Sie hier .
Wenn Sie Daten außerhalb des Winkelkontexts (dh extern) mutieren, kennt Angular die Änderungen nicht. Möglicherweise müssen Sie ChangeDetectorRef oder NgZone in Ihrer Komponente verwenden, um externe Änderungen im Winkel zu erkennen und damit die Änderungserkennung auszulösen. Beziehen Sie sich darauf .