Насправді, існує два способи виявлення та дії, коли вхід змінюється дочірньою складовою в angular2 +:
- Ви можете використовувати метод життєвого циклу ngOnChanges (), як це також було зазначено у попередніх відповідях:
@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
}
Посилання на документацію: ngOnChanges, SimpleChanges, SimpleChange
Demo Приклад: Подивіться на цей планкер
- Крім того, ви також можете встановити властивість введення властивостей у такий спосіб:
private _categoryId: string;
@Input() set categoryId(value: string) {
this._categoryId = value;
this.doSomething(this._categoryId);
}
get categoryId(): string {
return this._categoryId;
}
Посилання на документацію: Подивіться тут .
Демонстраційний приклад. Подивіться на цей планкер .
Який підхід потрібно використовувати?
Якщо ваш компонент має кілька входів, то, якщо ви будете використовувати ngOnChanges (), ви отримаєте всі зміни для всіх входів одночасно в межах ngOnChanges (). Використовуючи такий підхід, ви також можете порівняти поточні та попередні значення змін, які змінилися, та вжити відповідних дій.
Однак якщо ви хочете щось зробити, коли змінюється лише певний окремий вхід (і вам не байдуже про інші входи), можливо, простіше використовувати налаштування властивостей вводу. Однак такий підхід не забезпечує побудованого способу порівняння попередніх та поточних значень зміненого входу (що можна легко зробити методом ngOnChanges життєвого циклу).
РЕДАКТИРУЙТЕ 2017-07-25: АНГУЛЯРНЕ ВИДАЛЕННЯ ЗМІНИ МОЖЕ НЕ ПОЖЕЖИТЬСЯ ДІЯЛЬКИХ ОКРУГИ
Зазвичай виявлення змін як для сеттера, так і для ngOnChanges запускається кожного разу, коли батьківський компонент змінює дані, які він передає дочірній, за умови, що дані є примітивним типом даних JS (рядок, число, булевий) . Однак у наступних сценаріях це не спрацює, і вам доведеться вжити додаткових дій, щоб змусити його працювати.
Якщо ви використовуєте вкладений об'єкт або масив (замість примітивного типу даних JS) для передачі даних від батьків до дитини, виявлення змін (використовуючи сетер або ngchanges) може не спрацювати, як це також було зазначено у відповіді користувача: muetzerich. Рішення шукайте тут .
Якщо ви мутуєте дані за межами кутового контексту (тобто зовні), то кутовий не буде знати про зміни. Можливо, вам доведеться використовувати ChangeDetectorRef або NgZone у своєму компоненті для того, щоб дізнатись про зовнішні зміни і тим самим викликати виявлення змін. Зверніться до цього .