W rzeczywistości istnieją dwa sposoby wykrywania i reagowania, gdy dane wejściowe zmieniają się w elemencie potomnym w angular2 +:
- Możesz użyć metody cyklu życia ngOnChanges (), jak również wspomniano w starszych odpowiedziach:
@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
}
Łącza do dokumentacji: ngOnChanges, SimpleChanges, SimpleChange
Demo Przykład: Spójrz na tego plunkera
- Alternatywnie można również użyć setera właściwości wprowadzania w następujący sposób:
private _categoryId: string;
@Input() set categoryId(value: string) {
this._categoryId = value;
this.doSomething(this._categoryId);
}
get categoryId(): string {
return this._categoryId;
}
Link do dokumentacji: Look tutaj .
Przykład demonstracyjny: spójrz na tego plunkera .
JAKIEGO PODEJŚCIA POWINIENEŚ WYKORZYSTAĆ?
Jeśli twój komponent ma kilka danych wejściowych, to jeśli użyjesz ngOnChanges (), otrzymasz wszystkie zmiany dla wszystkich danych naraz w ngOnChanges (). Korzystając z tego podejścia, możesz także porównać bieżące i poprzednie wartości zmienionego wejścia i odpowiednio podjąć działania.
Jeśli jednak chcesz coś zrobić, gdy zmienia się tylko jedno pojedyncze wejście (i nie przejmujesz się pozostałymi danymi wejściowymi), łatwiejsze może być ustawienie właściwości wprowadzania. Jednak to podejście nie zapewnia wbudowanego sposobu porównywania poprzednich i bieżących wartości zmienionych danych wejściowych (co można łatwo zrobić za pomocą metody cyklu życia ngOnChanges).
EDYCJA 2017-07-25: WYKRYWANIE ZMIAN KĄTOWYCH MOŻE NIE POŻAROWAĆ W NIEKTÓRYCH OKOLICZNOŚCIACH
Zwykle wykrywanie zmian zarówno dla metody ustawiającej, jak i ngOnChanges będzie uruchamiane za każdym razem, gdy składnik nadrzędny zmienia dane, które przekazuje do dziecka, pod warunkiem, że dane są pierwotnym typem danych JS (ciąg, liczba, wartość logiczna) . Jednak w poniższych scenariuszach nie będzie działać i musisz podjąć dodatkowe działania, aby działało.
Jeśli używasz zagnieżdżonego obiektu lub tablicy (zamiast pierwotnego typu danych JS) do przekazywania danych z rodzica na dziecko, wykrywanie zmian (przy użyciu settera lub ngchanges) może się nie uruchomić, jak wspomniano również w odpowiedzi użytkownika: muetzerich. Rozwiązania znajdziesz tutaj .
Jeśli mutujesz dane poza kontekstem kątowym (tj. Zewnętrznie), wówczas kątowy nie będzie wiedział o zmianach. Być może będziesz musiał użyć ChangeDetectorRef lub NgZone w swoim komponencie, aby uświadomić kątowe zmiany zewnętrzne i tym samym uruchomić wykrywanie zmian. Zobacz to .