На самом деле, существует два способа обнаружения и обработки при изменении входа дочернего компонента в 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: ОБНАРУЖЕНИЕ ИЗМЕНЕНИЯ УГЛОВОГО ИЗМЕНЕНИЯ МОЖЕТ ЕЩЕ НЕ ПОЖАРИТЬСЯ ОТ НЕКОТОРЫХ ОБСТОЯТЕЛЬСТВ
Обычно обнаружение изменений для setter и ngOnChanges срабатывает всякий раз, когда родительский компонент изменяет данные, которые он передает дочернему, при условии, что данные являются примитивным типом данных JS (строка, число, логическое значение) . Однако в следующих сценариях он не сработает, и вам придется предпринять дополнительные действия, чтобы заставить его работать.
Если вы используете вложенный объект или массив (вместо примитивного типа данных JS) для передачи данных от Parent к Child, обнаружение изменений (с использованием либо setter, либо ngchanges) может не сработать, что также упоминается в ответе пользователя: muetzerich. Решения смотрите здесь .
Если вы изменяете данные вне углового контекста (то есть извне), то angular не будет знать об изменениях. Возможно, вам придется использовать ChangeDetectorRef или NgZone в вашем компоненте, чтобы постоянно информировать о внешних изменениях и тем самым запускать обнаружение изменений. Обратитесь к этому .